LINQ beherrschen: GroupBy, Sum und Count für eine effiziente Datenaggregation
Dieser Artikel befasst sich mit einer häufigen Herausforderung bei der C#-Programmierung: dem effizienten Gruppieren, Summieren und Zählen von Elementen innerhalb einer Sammlung mithilfe der LINQ-Methoden GroupBy
, Sum
und Count
. Wir werden ein praktisches Beispiel untersuchen, eine häufige Fallstricke hervorheben und eine robuste Lösung vorstellen.
Das Szenario: Produktaggregation
Stellen Sie sich eine Sammlung von Product
-Objekten vor, jedes mit einem ProductCode
, Price
und Name
. Das Ziel besteht darin, diese Produkte nach ihrem ProductCode
zu gruppieren, den Gesamtpreis für jeden Code zu berechnen und die Anzahl der Produkte in jeder Gruppe zu zählen. Die gewünschte Ausgabe ist eine neue Sammlung, in der jeder Artikel einen Produktcode, seinen Gesamtpreis und die Produktanzahl darstellt.
Der anfängliche (fehlerhafte) Ansatz
Ein erster Versuch könnte so aussehen:
<code class="language-csharp">List<Product> products = LoadProducts(); List<ResultLine> result = products .GroupBy(p => p.ProductCode) .SelectMany(group => group.Select( p => new ResultLine { ProductName = p.Name, Quantity = group.Count().ToString(), Price = group.Sum(p => p.Price).ToString(), })) .ToList();</code>
Das Problem bei diesem Code ist die Verwendung von SelectMany
. Dadurch werden die gruppierten Ergebnisse abgeflacht, was zu einem falschen Quantity
(immer 1) führt.
Die richtige Lösung
Die effiziente und genaue Lösung vermeidet SelectMany
und wählt die aggregierten Daten aus jeder Gruppe direkt aus:
<code class="language-csharp">List<ResultLine> result = products .GroupBy(p => p.ProductCode) .Select(group => new ResultLine { ProductName = group.First().Name, // Assumes all products with the same code have the same name Quantity = group.Count(), Price = group.Sum(p => p.Price), }) .ToList();</code>
Dieser überarbeitete Code gruppiert die Produkte korrekt. group.First().Name
ruft den Namen des ersten Produkts in jeder Gruppe ab (unter der Annahme konsistenter Namen für denselben Produktcode). group.Count()
liefert die genaue Anzahl für jede Gruppe und group.Sum(p => p.Price)
berechnet den Gesamtpreis. Beachten Sie, dass Quantity
und Price
jetzt die entsprechenden numerischen Typen haben (int bzw. decimal), wodurch die Datenintegrität verbessert wird.
Durch die Eliminierung von SelectMany
und den direkten Zugriff auf Gruppeneigenschaften erreichen wir eine effiziente und genaue Datenaggregation und vermeiden so die häufige Gefahr einer unbeabsichtigten Datenreduzierung. Dieser Ansatz stellt sicher, dass die resultierende Sammlung die gruppierten, summierten und gezählten Daten aus der ursprünglichen Produktsammlung genau widerspiegelt.
Das obige ist der detaillierte Inhalt vonWie kann ich die Gruppe von Linq Groupby, Sum und Count verwenden, um Elemente in einer Sammlung effizient zu gruppieren, zu summen und zu zählen, um gemeinsame Fallstricke zu vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!