Home > Backend Development > C++ > How to Correctly Group, Sum, and Count Products in LINQ with GroupBy?

How to Correctly Group, Sum, and Count Products in LINQ with GroupBy?

Patricia Arquette
Release: 2025-01-24 17:01:09
Original
849 people have browsed it

How to Correctly Group, Sum, and Count Products in LINQ with GroupBy?

Group, sum and count products using LINQ: GroupBy method

Problem Description

We have a collection of products that need to be grouped by product code. The goal is to create an object that contains the product name, product quantity, and total price for each product code.

Code snippet (error example)

The initial code uses GroupBy to group by product code and then calculate the sum and count for each group.

<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>
Copy after login

The problem

While this code calculates the sum correctly, the count for all products always shows 1.

Example data

<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>
Copy after login

Expected results

<code>Product1: count 2   - Price:13 (2x6.5)
Product2: count 1   - Price:12 (1x12)</code>
Copy after login

Solution

The problem is using SelectMany to check every item in every group. The correct approach is:

<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>
Copy after login

Assuming products with the same code have the same name, we can use First() to get the product name. SelectMany flattens the result set, causing counting errors, while Select directly operates on the grouped results.

This revised answer maintains the image and provides a more accurate and concise explanation of the LINQ problem and solution. The wording is also adjusted for improved clarity and flow.

The above is the detailed content of How to Correctly Group, Sum, and Count Products in LINQ with GroupBy?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template