Maison >développement back-end >C++ >Comment grouper correctement, résumer et compter les produits dans LINQ avec Groupby?

Comment grouper correctement, résumer et compter les produits dans LINQ avec Groupby?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-24 17:01:09800parcourir

How to Correctly Group, Sum, and Count Products in LINQ with 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!

Déclaration:
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