Posts mit Tag: Snippets

Listen filtern mit LINQ – c# Snippets

Damit die Reihe c# Snippets gleich mit zwei Artikel startet folgt nun noch ein kurzes aber praktisches Snippet.

Problemstellung
Gegeben ist eine Liste.
Gesucht ist eine Teilmenge der Liste, die eine bestimmte Bedingung erfüllt.

Beispiel
Gegeben: List<int> list = new List<int>() { 5, 3, 17, 2, 23 };
Gesucht ist eine neue Liste, die alle Elemente größer 10 enthält.

View Code CSHARP
1
2
List<int> list = ...;
List<int> result = (from i in list where i > 10 select i).ToList();

In dem Select-Teil kann auch Code ausgeführt werden, zum Beispiel wenn die Quadrate der Zahlen gesucht sind:

View Code CSHARP
1
2
List<int> list = ...;
List<int> result = (from i in list where i > 10 select i * i).ToList();

SerializeToString – c# Snippets

Dieser Artikel ist der erste Teil der Reihe c# Snippets.

Oftmals hat man eine Liste von Elementen möchte diese aber als einen String darstellen.

Beispiel
Gegegen ist eine Liste von decimal-Werten:
List<decimal>list = new list<decimal>{ 1.05, 2.50; 3.66 };
Gewünscht ist "1,05; 2,50; 3,66"

Der herkömmliche Ansatz
… sieht dann vermutlich so oder so ähnlich aus:

View Code CSHARP
1
2
3
4
5
6
StringBuilder sb = new StringBuilder();
foreach (decimal d in list) {
    sb.Append(d.ToString("0.00") + ";  ");
}
if (sb.Length > 0) sb.Length -=2; // Trennzeichen am Ende entfernen
return sb.ToString();

Die Hilfsmethode SerializeToString mit Lamda-Ausdrücken

View Code CSHARP
1
2
3
4
5
6
7
8
9
static class StringExtensions
{
    public static string SerializeToString<T>(this IEnumerable<T> list, Func<T, string> serialize, string separator)
    {
        StringBuilder sb2 = list.Aggregate(new StringBuilder(), (sb, item) => sb.Append(serialize(item) + separator));
        if (sb2.Length > 0) sb2.Length -= separator.Length;
        return sb2.ToString();
    }
}

Der Aufruf von SerializeToString
ist nun wesentlich kürzer und meiner Meinung nach besser lesbar:

View Code CSHARP
1
string serializedValues = list.SerializeToString(d => d.ToString("0.00"));

Natürlich funktioniert dies auch für Listen von komplexeren Datenstrukturen und auch verschachtelt:

View Code CSHARP
1
2
3
4
5
6
7
List<List<DateTime>> list = ...;
 
string serializedValues = list.SerializeToString(i1 => i1.Count + " Elemente: " + i1.SerializeToString(i2 => i2.ToString(), ", "), "\r\n");
// Beispiel-Ausgabe:
// 1.1.2010, 2.1.2010
// 1.1.2011, 2.1.2011, 3.1.2011
// ...

WordPress Themes