Maison >développement back-end >C++ >Comment grouper correctement, résumer et compter les produits dans LINQ avec Groupby?
Regrouper, additionner et compter les produits à l'aide de LINQ : méthode GroupBy
Description du problème
Nous avons une collection de produits qui doivent être regroupés par code produit. L'objectif est de créer un objet contenant le nom du produit, la quantité du produit et le prix total pour chaque code produit.
Extrait de code (exemple d'erreur)
Le code initial utilise GroupBy
pour regrouper par code produit puis calculer la somme et compter pour chaque groupe.
<code class="language-csharp">List<resultline> result = Lines .GroupBy(l => l.ProductCode) .SelectMany(cl => cl.Select( csLine => new ResultLine { ProductName = csLine.Name, Quantity = cl.Count().ToString(), Price = cl.Sum(c => c.Price).ToString(), })).ToList<resultline>();</code>
Le problème
Bien que ce code calcule correctement la somme, le décompte de tous les produits indique toujours 1.
Exemples de données
<code class="language-csharp">List<cartline> Lines = new List<cartline>(); Lines.Add(new CartLine() { ProductCode = "p1", Price = 6.5M, Name = "Product1" }); Lines.Add(new CartLine() { ProductCode = "p1", Price = 6.5M, Name = "Product1" }); Lines.Add(new CartLine() { ProductCode = "p2", Price = 12M, Name = "Product2" });</code>
Résultats attendus
<code>Product1: count 2 - Price:13 (2x6.5) Product2: count 1 - Price:12 (1x12)</code>
Solution
Le problème est d'utiliser SelectMany
pour vérifier chaque élément de chaque groupe. La bonne approche est :
<code class="language-csharp">List<resultline> result = Lines .GroupBy(l => l.ProductCode) .Select(cl => new ResultLine { ProductName = cl.First().Name, Quantity = cl.Count().ToString(), Price = cl.Sum(c => c.Price).ToString(), }).ToList();</code>
En supposant que les produits avec le même code portent le même nom, nous pouvons utiliser First()
pour obtenir le nom du produit. SelectMany
aplatit l'ensemble de résultats, provoquant des erreurs de comptage, tandis que Select
opère directement sur les résultats groupés.
Cette réponse révisée conserve l'image et fournit une explication plus précise et concise du problème et de la solution LINQ. La formulation est également ajustée pour améliorer la clarté et la fluidité.
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!