CountBy() und AggregateBy()

CountBy() und AggregateBy() – Neue LINQ queries in .NET9

Morris Müller | Softwareentwickler | 14.03.2024

CountBy() und AggregateBy() – Neue LINQ queries in .NET9

Am 13. Februar ist die erste Preview für .NET 9 erschienen und beinhaltet direkt praktisch nützliche Änderungen für Entwickler. Die beiden neu implementierten LINQ-Methoden werden den Umgang mit Listen in Zukunft an einigen Stellen vereinfachen.

CountBy()

Die erste neue Query repliziert ein oft gebrauchtes aber bislang nicht mit .NET-Bordmitteln umsetzbares feature: Das abzählen von Listenelementen anhand eines bestimmten Keys.

Nehmen wir im Folgenden an, dass wir eine Liste von Patienten verarbeiten, denen jeweils ein einzelner Pfleger zugeordnet ist.

record Patient(string Pfleger, int PatientenNummer); 
var Patienten = new List<Patient>() 
{ 
        new Patient("Hans", 1), 
        new Patient("Sarah", 2), 
        new Patient("Kai", 3), 
        new Patient("Wurst", 4), 
        new Patient("Hans", 5), 
        new Patient("Sarah", 6), 
};

Da uns unsere Pfleger am Herzen liegen, wollen wir darauf Acht geben, dass keiner von ihnen überlastet wird und uns alle Pfleger anzeigen lassen, die derzeit mehr als einem Patienten zugeordnet ist.

Hier kommt die neu Query CountBy() ins Spiel, welcher wir einfach den Namen des Pflegers als Key übergeben und eine List and Key/Value Pairs aller Pfleger mit der Zahl ihrer Patienten zurückbekommen.

var pflegerUeberlastung = Patienten.CountBy(p => p.Pfleger);

 

Das Resultat sieht aus wie folgt:

Natürlich wollen wir, wie eingangs erwähnt, nur die überbelegten Pfleger anzeigen, weshalb wir einen Filter hinten anhängen, welcher nur die Pfleger auswählt, die mehr als einen Patienten haben. Diese können wir dann bequem in unser Programm zurückschreiben.

Und so sieht die Ausgabe dann aus.

var pflegerUeberlastung = Patienten.CountBy(p => p.Pfleger).Where(x => x.Value > 1); 



foreach (var (pfleger, anzahl) in pflegerUeberlastung) 

{ 

    Console.WriteLine($"{pfleger} hat {anzahl} Patienten"); 

}

AggregateBy()

Treten wir einen Schritt zurück und betrachten das ganze Krankenhaus, welches aus mehreren Stationen besteht.

record Station(string StationsName, int BelegteBetten); 

var Stationen = new List<Station>() 

{ 

        new Station("Notaufnahme", 39), 

        new Station("Radiologie", 10), 

        new Station("Chirurgie", 14), 

        new Station("Intensivstation", 38), 

        new Station("Neurologie", 4), 

}

Ganz schön viel los! Damit wir unser Personal besser planen können, möchte unser Direktor gerne wissen, wie viele Intensivpfleger er für die Kombination aus Notaufnahme und Intensivstation bereitstellen muss. Um dies herauszufinden, können wir die neue AggregateBy() Methode verwenden.

Stationen.AggregateBy(keySelector: station => station.StationsName.Contains("Notaufnahme") || station.StationsName.Contains("Intensivstation"), 

                      seed: 0, 

                      (belegteBetten, curr) => belegteBetten + curr.BelegteBetten)

Als Schlüssel übergeben wir die Namen der Stationen, welche wir aggregieren wollen (Hinweis: Da wir abfragen wollen, ob die jeweilige Station in unser Schema passt, verwenden wir hier den keySelector und füttern ihn mit unserer Abfrage). Da wir davon ausgehen, dass es keine weiteren Betten mit Intensivpflegerbedarf außerhalt unserer Stationen gibt, seeden wir die Funktion bei 0.
Schlussendlich stellen wir noch die Aggregationslogik als Funktion zur Verfügung: Sie summiert einfach die jeweils angegebenen belegten Betten der Station auf.

Da unsere Aggregation eine Auswahl trifft, zwischen zutreffenden und nichtzutreffenden Stationen filtern wir anschließend noch das zurückgegebene Enumerable auf die Einträge, die unseren Key erfüllt haben. Dann lesen wir der Einfachheit direkt den eigentlichen Wert aus und können ich sofort anzeigen lassen.

Stationen.AggregateBy(keySelector: station => station.StationsName.Contains("Notaufnahme") || station.StationsName.Contains("Intensivstation"), 

                      seed: 0, 

                      (belegteBetten, curr) => belegteBetten + curr.BelegteBetten) 

                  .First(x => x.Key) 

                  .Value;

Und schon bekommen wir unser Ergebnis und der Direktor kann seinen Plan erstellen!

Wie Sie sehen, stellen die Neuerungen in .NET 9 uns praktische Funktionen zur Verfügung, die das Abfragen oft gebrauchter Informationen vereinfachen werden.

Github-Archiv: https://github.com/MMuellerDevware/Neue-LINQ-Queries-in-.NET-9

 

Morris Müller | Softwareentwickler | 14.03.2024

 

 

Sie suchen einen Software Anbieter?
Sprechen Sie uns an