Meine Lieblingserweiterungen in C#/LINQ

Im Laufe der Zeit habe ich mir ein kleines Repertoire an Extensions und Hilfsfunktionen in C# und LINQ angesammelt. Hier meine Favoriten:

1. ForEach()
2. IsEmpty()
3. GetSQLDate()
4. Stopwatch extensions
5. StringBuilder extensions
6. Merging lists
7. Left/Mid/Right

1. ForEach()

 
        public static void ForEach<T> (this IEnumerable<T>  enumeration, Action<T>  action)
        {
            foreach (T item in enumeration)
            {
                action(item);
            }
        }

Beispiel:

 
int[] foo = { 1, 2, 3, 4, 5 };
foo.ForEach(p =>  p *= p);
// foo enthält nun: { 1, 4, 9, 16, 25 }

(Bitte verschont mich mit Kommentaren bzgl. des Gebrauchs von foreach-Schleifen.)


2. IsEmpty()

 
        public static Boolean IsEmpty<T> (this IEnumerable<T>  source)
        {
            try
            {
                if (source == null)
                    return true;
                return !source.Any();
            }
            catch
            {
                return true;
            }
        }

Beispiel:

 
int[] foo = { 1, 2, 3, 4, 5 };
bool bar;

bar = foo.IsEmpty();
// bar ist nun false
foo = null;
bar = foo.IsEmpty();
// bar ist nun true

3. GetSQLDate()
Wandelt ein Datumswert in das SQL-Server Standardformat um.

 
        public static string GetSQLDate(this DateTime? _d)
        {
            if (_d.HasValue)
                return string.Concat("'", _d.Value.ToString("yyyy-MM-dd HH:mm:ss"), "'");
            else
                return "NULL";
        }

Beispiel:

 
DateTime foo = DateTime.Now;
string SQL = string.Format("SELECT ID FROM dbo.dummy_table WHERE datetime={0};", foo.GetSQLDate());

/*
Wäre "foo" ein DateTime?, also nullable, würde nach "NULL" gesucht werden. Das ist bei SELECT-Abfragen ggf.
unerwünscht, aber bei INSERT-Abfragen durchaus gewollt.
*/

4. Stopwatch extensions

 
        public static string StopAndGetSecondsString(this Stopwatch stopwatch)
        {
            stopwatch.Stop();
            double Seconds = stopwatch.ElapsedTicks / (float)Stopwatch.Frequency;
            return String.Format("{0:0.0000}", Seconds);
        }

        public static void Restart(this Stopwatch stopwatch)
        {
            stopwatch.Stop();
            stopwatch.Reset();
            stopwatch.Start();
        }

        public static Stopwatch GetStartedStopwatch()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            return stopwatch;
        }

Beispiel:

 
Stopwatch sw = GetStartedStopwatch(); // Stopwatch läuft bereits!

// Zeitintensive Operationen hier einfügen...

Console.WriteLine(sw.StopAndGetSecondsString()); // Stoppen und Ausgabe auf Console.

sw.Restart(); // Zurücksetzen und wieder starten.

5. StringBuilder extensions

 
        public static StringBuilder AppendAllElements(this StringBuilder _S, IEnumerable<string>  _IE)
        {
            _IE.ForEach(s =>  _S.AppendLine(s));
            return _S;
        }

Beispiel:

 
StringBuilder sb = new StringBuilder();
List<string>  s = new List<string> () { "a", "b", "c", "d", "e" };

sb.AppendAllElements(s); // füge alle Objekte aus "s" an den StringBuilder (zeilengetrennt!)

Console.WriteLine(sb.ToString()); // Ausgabe auf die Console

6. Merging lists

 
        public static IEnumerable<string>  Merge(this IEnumerable<IEnumerable<string> >  enumeration)
        {
            List<string>  _l = new List<string> ();
            foreach (IEnumerable<string>  item in enumeration)
            {
                _l.AddRange(item);
            }
            return _l.AsEnumerable();
        }

Beispiel:

 
List<List<string> >  s1 = new List<List<string> > (); // Jagged bzw. mehrdimensionale Liste!
List<string>  s2 = new List<string> () { "a", "b", "c", "d", "e" };
List<string>  s3 = new List<string> () { "D", "1", "V", "F", "Q" };
s1.Add(s2);
s1.Add(s3);

List<string>  s4 = s1.Merge().ToList();
// s4 enthält nun: 
// "a", "b", "c", "d", "e", "D", "1", "V", "F", "Q"

Wie ich später herausgefunden habe, geht das ganze auch viel einfacher ohne Extension, nur mit SelectMany() :

Beispiel:

 
List<List<string> >  s1 = new List<List<string> > (); // Jagged bzw. mehrdimensionale Liste!
List<string>  s2 = new List<string> () { "a", "b", "c", "d", "e" };
List<string>  s3 = new List<string> () { "D", "1", "V", "F", "Q" };
s1.Add(s2);
s1.Add(s3);

List<string>  s4 = s1.SelectMany(x =>  x).ToList();
// s4 enthält nun: 
// "a", "b", "c", "d", "e", "D", "1", "V", "F", "Q"

7. Left/Mid/Right
Stringoperationen für alle VB-Umsteiger:

 
        public static string Left(this string param, int length)
        {
            return param.Substring(0, length);
        }

        public static string Right(this string param, int length)
        {
            return param.Substring(param.Length - length, length);
        }

        public static string Mid(this string param, int startIndex, int length)
        {
            return param.Substring(startIndex, length); ;
        }

        public static string Mid(this string param, int startIndex)
        {
            return param.Substring(startIndex);
        }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.