首页 >后端开发 >C++ >如何使用 LINQ 的 GroupBy、Sum 和 Count 来有效地对集合中的项目进行分组、求和和计数,从而避免常见的陷阱?

如何使用 LINQ 的 GroupBy、Sum 和 Count 来有效地对集合中的项目进行分组、求和和计数,从而避免常见的陷阱?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-24 16:42:12425浏览

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

掌握 LINQ:GroupBy、Sum 和 Count 以实现高效数据聚合

本文解决了 C# 编程中的一个常见挑战:使用 LINQ 的 GroupBySumCount 方法对集合中的项目进行高效分组、求和和计数。 我们将探索一个实际示例,突出常见的陷阱,并提出一个强大的解决方案。

场景:产品聚合

想象一个 Product 对象的集合,每个对象都有一个 ProductCodePriceName。目标是按 ProductCode 对这些产品进行分组,计算每个代码的总价格,并计算每组中的产品数量。 所需的输出是一个新集合,其中每个项目代表一个产品代码、总价和产品数量。

最初(有缺陷的)方法

初始尝试可能如下所示:

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

这段代码的问题在于SelectMany的使用。 这会扁平化分组结果,导致不正确的 Quantity(始终为 1)。

正确的解决方案

高效准确的解决方案避免了SelectMany,直接选择各组的聚合数据:

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

此修订后的代码正确地对产品进行了分组。 group.First().Name 检索每组中第一个产品的名称(假设相同产品代码的名称一致)。 group.Count() 提供每组的准确计数,group.Sum(p => p.Price) 计算总价。 请注意,QuantityPrice 现在具有适当的数字类型(分别为 int 和decimal),从而提高了数据完整性。

通过消除SelectMany并直接访问组属性,我们实现了高效、准确的数据聚合,避免了意外数据扁平化的常见陷阱。 此方法可确保生成的集合准确反映原始产品集合中分组、求和和计数的数据。

以上是如何使用 LINQ 的 GroupBy、Sum 和 Count 来有效地对集合中的项目进行分组、求和和计数,从而避免常见的陷阱?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn