掌握 LINQ:GroupBy、Sum 和 Count 以实现高效数据聚合
本文解决了 C# 编程中的一个常见挑战:使用 LINQ 的 GroupBy
、Sum
和 Count
方法对集合中的项目进行高效分组、求和和计数。 我们将探索一个实际示例,突出常见的陷阱,并提出一个强大的解决方案。
场景:产品聚合
想象一个 Product
对象的集合,每个对象都有一个 ProductCode
、Price
和 Name
。目标是按 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)
计算总价。 请注意,Quantity
和 Price
现在具有适当的数字类型(分别为 int 和decimal),从而提高了数据完整性。
通过消除SelectMany
并直接访问组属性,我们实现了高效、准确的数据聚合,避免了意外数据扁平化的常见陷阱。 此方法可确保生成的集合准确反映原始产品集合中分组、求和和计数的数据。
以上是如何使用 LINQ 的 GroupBy、Sum 和 Count 来有效地对集合中的项目进行分组、求和和计数,从而避免常见的陷阱?的详细内容。更多信息请关注PHP中文网其他相关文章!