Heim > Backend-Entwicklung > C++ > Wie 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?

Wie 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?

Mary-Kate Olsen
Freigeben: 2025-01-24 16:42:12
Original
423 Leute haben es durchsucht

How can I use LINQ's GroupBy, Sum, and Count to efficiently group, sum, and count items in a collection, avoiding common pitfalls?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage