Gruppierung von In-Memory-Listen in C# mit LINQ und Lambda-Ausdrücken
Bei der Arbeit mit Listen in C# können verschiedene Szenarien auftreten, in denen Sie Elemente basierend auf einer bestimmten Eigenschaft gruppieren müssen. Angenommen, Sie haben eine Sammlung von Foo
-Objekten, und Sie möchten diese basierend auf den Werten ihrer Bar
-Eigenschaften organisieren. Hier kommt die Leistungsfähigkeit von LINQ (Language Integrated Query) und Lambda-Ausdrücken ins Spiel. In diesem Blogbeitrag werden wir untersuchen, wie man In-Memory-Listen mit diesen C#-Funktionen effektiv gruppiert.
Das Problem verstehen
Stellen Sie sich vor, Sie haben eine Liste von Foo
-Objekten, bei denen jedes Foo
die Eigenschaften Bar
und Lum
hat. Einige Foo
-Instanzen können denselben Wert für Bar
teilen. Ihr Ziel ist es, diese Foo
-Instanzen nach ihren Bar
-Werten zu gruppieren und dann über die gruppierten Sammlungen zu iterieren, um auf ihre entsprechenden Lum
-Werte zuzugreifen. Dies kann die Datenorganisation verbessern und es einfacher machen, bestimmte Datensätze zu manipulieren.
Beispielszenario
Betrachten wir ein spezifisches Beispiel mit der folgenden Liste von Foo
-Instanzen:
var foos = new List<Foo> {
new Foo{Bar = 1,Lum = 1},
new Foo{Bar = 1,Lum = 2},
new Foo{Bar = 2,Lum = 3},
};
Gewünschtes Ergebnis
Wir möchten diese Foo
-Instanzen nach ihren Bar
-Werten gruppieren, sodass letztendlich Folgendes entsteht:
- Für
Bar = 1
:Lum = 1
,Lum = 2
- Für
Bar = 2
:Lum = 3
Lösung mit LINQ
Sie können die Foo
-Objekte mithilfe der group by
-Klausel von LINQ gruppieren. So wird es erreicht:
var groupedFoos = from foo in foos
group foo by foo.Bar into grouped
let lums = from g in grouped
select g.Lum
select new { Bar = grouped.Key, Lums = lums };
Schritte erklärt
- Gruppieren nach: Der Teil
group foo by foo.Bar
gruppiert dieFoo
-Instanzen basierend auf derBar
-Eigenschaft. - In gruppiert: Dies erstellt einen neuen Geltungsbereich für jede Gruppe.
- Lum-Werte auswählen: Die Anweisung
let lums
ermöglicht es Ihnen, eine neue Sammlung zu erstellen, die ausLum
-Werten der gruppierten Objekte besteht. - Endauswahl: Die abschließende Auswahl fügt alles zu einem neuen Objekt zusammen, das den
Bar
-Wert und die entsprechende Liste vonLum
-Werten enthält.
Lösung mit Lambda-Ausdrücken
Alternativ können Sie dasselbe Ergebnis mit Lambda-Ausdrücken erzielen, die einen kompakteren Syntax bieten können. So geht’s:
var groupedFoos = foos.GroupBy(x => x.Bar)
.Select(y => new { Bar = y.Key, Lums = y.Select(z => z.Lum) });
So funktioniert es
- GroupBy: Diese Methode nimmt eine Lambda-Funktion, um die Eigenschaft anzugeben, nach der wir gruppieren möchten, nämlich
x.Bar
. - Select: Nach der Gruppierung verwenden wir
Select
, um für jede Gruppe ein neues anonymer Objekt zu erstellen, das dieBar
und die entsprechendenLum
-Werte enthält.
Iteration durch gruppierte Daten
Unabhängig davon, ob Sie LINQ oder Lambda-Ausdrücke verwenden, bleibt die Iteration durch die gruppierten Daten gleich. Sie können durch jede Gruppe iterieren und die Lum
-Werte wie folgt ausgeben:
foreach (var group in groupedFoos)
{
Console.WriteLine("Lums für Bar#" + group.Bar);
foreach (var lum in group.Lums)
{
Console.WriteLine(lum);
}
}
Die Ausgabe wird sein:
Lums für Bar#1
1
2
Lums für Bar#2
3
Fazit
Die Gruppierung von In-Memory-Listen mit LINQ oder Lambda-Ausdrücken in C# ist eine leistungsstarke Möglichkeit, Ihre Daten zu organisieren. Egal, ob Sie die Lesbarkeit der LINQ-Syntax oder die Kompaktheit von Lambda-Ausdrücken bevorzugen, beide Ansätze ermöglichen es Ihnen, die gewünschte Gruppierung Ihrer Daten effektiv zu erreichen.
Für diejenigen, die ihr Verständnis von LINQ vertiefen möchten, sollten Sie 101 LINQ-Beispiele erkunden, um umfassendere Beispiele zu erhalten.
Wenn Sie Fragen haben oder Ihre Erfahrungen mit der Gruppierung von Daten in C# teilen möchten, hinterlassen Sie gerne einen Kommentar unten!