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>
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>
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!