Group by in LINQ: 5 Fragen, die Anfänger quälen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Group by in LINQ: Gruppierung anhand realer Beispiele verstehen

\n\n

Wenn Sie jemals Abfragen an Sammlungen in C# geschrieben haben, sind Sie sicherlich auf die Aufgabe gestoßen: „Wie kann ich Daten gruppieren?“. Das Thema group by in LINQ ist eines der beliebtesten auf Stack Overflow (Zehntausende von Aufrufen). Und das ist kein Zufall: Gruppierung erscheint nur auf den ersten Blick einfach. In der Praxis stolpern Anfänger über typische Fallstricke: wie man den ersten Datensatz in einer Gruppe auswählt, wie man eine Summe berechnet oder eine verschachtelte Gruppierung vornimmt.

\n\n

In diesem Artikel analysieren wir die 5 häufigsten Fragen zu LINQ GroupBy und geben funktionierende Antworten. Los geht's!

\n\n

1. Wie funktioniert GroupBy in LINQ? Grundlegende Syntax

\n\n

Die Methode GroupBy ist das Analogon des SQL-Operators GROUP BY. Sie teilt eine Sequenz basierend auf einem angegebenen Schlüssel in Gruppen auf. Das Ergebnis ist eine Sammlung von IGrouping<TKey, TElement>-Objekten, wobei jedes Objekt den Schlüssel und alle Elemente enthält, die in diese Gruppe fallen.

\n\n

Hier ist ein einfaches Beispiel. Angenommen, wir haben eine Liste von Studenten:

\n\n
public class Student\n{\n    public string Name { get; set; }\n    public string Group { get; set; }\n    public int Score { get; set; }\n}\n\nvar students = new List<Student>\n{\n    new Student { Name = "Anna", Group = "A", Score = 85 },\n    new Student { Name = "Boris", Group = "B", Score = 90 },\n    new Student { Name = "Vika", Group = "A", Score = 78 },\n    new Student { Name = "Gleb", Group = "B", Score = 92 }\n};
\n\n

Gruppieren nach dem Gruppennamen:

\n\n
var grouped = students.GroupBy(s => s.Group);\n\nforeach (var group in grouped)\n{\n    Console.WriteLine($"Gruppe: {group.Key}");\n    foreach (var student in group)\n    {\n        Console.WriteLine($"  {student.Name} — {student.Score}");\n    }\n}
\n\n

Ausgabe:

\n
Gruppe: A\n  Anna — 85\n  Vika — 78\nGruppe: B\n  Boris — 90\n  Gleb — 92
\n\n

Alles einfach. Aber der Teufel steckt, wie immer, im Detail.

\n\n

2. Wie wählt man den ersten Datensatz aus jeder Gruppe aus?

\n\n

Dies ist die häufigste Frage zu group by in LINQ. Angenommen, wir müssen den besten Studenten aus jeder Gruppe ermitteln (mit der höchsten Punktzahl). Wie macht man das?

\n\n

Die Lösung — kombinieren Sie GroupBy mit First() oder OrderByDescending:

\n\n
var bestStudents = students\n    .GroupBy(s => s.Group)\n    .Select(g => g.OrderByDescending(s => s.Score).First());\n\nforeach (var student in bestStudents)\n{\n    Console.WriteLine($"{student.Name} — {student.Group} — {student.Score}");\n}
\n\n

Ergebnis: Anna (85) und Gleb (92). Beachten Sie: Innerhalb von Select sortieren wir die Gruppe und nehmen das erste Element. Dies ist die Antwort auf die Frage „Wie macht man LINQ group by first“.

\n\n

Wichtig: First() löst eine Ausnahme aus, wenn die Gruppe leer ist. Falls dies möglich ist, verwenden Sie FirstOrDefault().

\n\n

3. Wie berechnet man Summe, Anzahl oder Durchschnitt pro Gruppe?

\n\n

Oft möchte man nach der Gruppierung nicht nur die Elemente durchgehen, sondern aggregierte Werte erhalten. Zum Beispiel die Summe der Punkte pro Gruppe oder den Durchschnitt.

\n\n

Wir verwenden Sum, Count, Average:

\n\n
var groupStats = students\n    .GroupBy(s => s.Group)\n    .Select(g => new\n    {\n        Group = g.Key,\n        Count = g.Count(),\n        TotalScore = g.Sum(s => s.Score),\n        AverageScore = g.Average(s => s.Score)\n    });\n\nforeach (var stat in groupStats)\n{\n    Console.WriteLine($"Gruppe {stat.Group}: {stat.Count} Studenten, Summe {stat.TotalScore}, Durchschnitt {stat.AverageScore:F2}");\n}
\n\n

Ausgabe:

\n
Gruppe A: 2 Studenten, Summe 163, Durchschnitt 81.50\nGruppe B: 2 Studenten, Summe 182, Durchschnitt 91.00
\n\n

Sie können auch Min und Max verwenden — in

Blogs

Buchempfehlungen