使用LINQ对产品进行分组、求和和计数:GroupBy方法
问题描述
我们有一个产品集合,需要按产品代码进行分组。目标是创建一个对象,包含每个产品代码的产品名称、产品数量和总价格。
代码片段 (错误示例)
最初的代码使用GroupBy
按产品代码分组,然后计算每个组的总和和计数。
<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>
问题所在
这段代码虽然正确计算了总和,但所有产品的计数都始终显示为1。
示例数据
<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>
预期结果
<code>Product1: count 2 - Price:13 (2x6.5) Product2: count 1 - Price:12 (1x12)</code>
解决方案
问题在于使用了SelectMany
来检查每个组中的每个项目。 正确的做法是:
<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>
假设相同代码的产品具有相同的名称,我们可以使用First()
来获取产品名称。 SelectMany
展平了结果集,导致计数错误,而 Select
直接操作分组后的结果。
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.
以上是如何与Groupby正确分组,总和和计数产品?的详细内容。更多信息请关注PHP中文网其他相关文章!