如何使用LINQ Lambda按双属性分组并执行SUM、AVG聚合操作
LINQ Lambda分组并聚合Candy集合的解决方案
看起来你已经找对了方向,但在分组键和聚合的写法上有点小问题,我来帮你修正一下:
首先,你需要按Id和Name共同分组,而不是只按Id分组——原来的GroupBy(c => c.Id, c => c.Name)写法不对,第二个参数是用来投影分组内元素的,不是第二个分组键。要实现多属性分组,我们需要把Id和Name包装成一个匿名类型作为分组键。
然后在Select里,我们可以利用LINQ的聚合方法(Sum、Average)来计算你需要的统计值,最后生成新的Candy对象。
完整代码示例
List<Candy> ungroupedCandies = GetCandies(); List<Candy> groupedCandies = ungroupedCandies // 按Id和Name共同分组,匿名类型作为分组键确保两者都匹配才会归为一组 .GroupBy(c => new { c.Id, c.Name }) // 对每个分组进行聚合计算 .Select(group => new Candy { Id = group.Key.Id, Name = group.Key.Name, // 注意:同一分组内的Distributor可能不同,这里根据你的需求调整 // 可选方案:设为null / 取第一个经销商 / 合并去重后的经销商列表 Distributor = string.Join(", ", group.Select(c => c.Distributor).Distinct()), Quantity = group.Sum(c => c.Quantity), // 对分组内的Quantity求和 UnitPrice = group.Average(c => c.UnitPrice) // 计算分组内UnitPrice的平均值 }) .ToList();
代码解释
分组逻辑:
GroupBy(c => new { c.Id, c.Name })
匿名类型会自动比较所有属性的值,只有当Id和Name完全相同时,Candy对象才会被分到同一组。聚合计算:
group.Sum(c => c.Quantity):遍历分组内的所有元素,把它们的Quantity值累加起来,得到该糖果的总库存。group.Average(c => c.UnitPrice):计算分组内所有UnitPrice的算术平均值。
Distributor的处理:
你的示例数据里,同一Id+Name的糖果可能来自不同经销商(比如Atomic Fireball有Wonka和Slugworth两个经销商),所以这里提供了一个合并去重经销商的方案,你也可以根据实际需求改成null或者group.First().Distributor(取第一个经销商)。
运行结果(基于你的示例数据)
执行后groupedCandies会包含以下对象:
{ Id = "AF001", Name = "Atomic Fireball", Distributor = "Wonka Candy, Slugworth Confections", Quantity = 400, UnitPrice = 1.5 }{ Id = "GW001", Name = "Gummy Worm", Distributor = "Wonka Candy, Slugworth Confections", Quantity = 450, UnitPrice = 2.5 }{ Id = "CG001", Name = "Cherry Gumball", Distributor = "Wonka Candy", Quantity = 30000, UnitPrice = 3 }{ Id = "GF001", Name = "Grape Fizzy", Distributor = "Slugworth Confections", Quantity = 30000, UnitPrice = 1 }
内容的提问来源于stack exchange,提问作者webworm
相关产品推荐
相关产品推荐

