Maison > développement back-end > C++ > Comment puis-je utiliser Groupby, SUM et compter pour les éléments de groupe, de somme et de comptage efficacement de Linq dans une collection, en évitant les pièges courants?

Comment puis-je utiliser Groupby, SUM et compter pour les éléments de groupe, de somme et de comptage efficacement de Linq dans une collection, en évitant les pièges courants?

Mary-Kate Olsen
Libérer: 2025-01-24 16:42:12
original
423 Les gens l'ont consulté

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

Mastering linq: groupby, sum et compter pour une agrégation efficace de données

Cet article aborde un défi commun dans la programmation C #: regrouper, résumé et compter efficacement les éléments dans une collection en utilisant des méthodes Linq GroupBy, Sum et Count. Nous explorerons un exemple pratique, soulignerons un écueil commun et présenterons une solution robuste.

Le scénario: agrégation de produits

Imaginez une collection d'objets Product, chacun avec un ProductCode, Price et Name. L'objectif est de regrouper ces produits par leur ProductCode, de calculer le prix total de chaque code et de compter le nombre de produits dans chaque groupe. La sortie souhaitée est une nouvelle collection où chaque élément représente un code produit, son prix total et le nombre de produits.

L'approche initiale (défectueuse)

Une première tentative pourrait ressembler à ceci:

<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>
Copier après la connexion

Le problème avec ce code est l'utilisation de SelectMany. Cela aplatit les résultats groupés, conduisant à un Quantity incorrect (toujours 1).

La bonne solution

La solution efficace et précise évite SelectMany et sélectionne directement les données agrégées de chaque groupe:

<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>
Copier après la connexion

Ce code révisé regroupe correctement les produits. group.First().Name récupère le nom du premier produit de chaque groupe (en supposant des noms cohérents pour le même code produit). group.Count() fournit le nombre précis pour chaque groupe, et group.Sum(p => p.Price) calcule le prix total. Notez que Quantity et Price sont désormais de leurs types numériques appropriés (int et décimal, respectivement), améliorant l'intégrité des données.

En éliminant SelectMany et en accédant directement aux propriétés du groupe, nous obtenons une agrégation de données efficace et précise, en évitant le piège commun de l'aplatissement des données non désigné. Cette approche garantit que la collection résultante reflète avec précision les données groupées, additionnées et comptées de la collecte de produits d'origine.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal