如何对List<Info>按指定字段分组求和得到期望聚合结果?
如何对合并后的列表按多字段分组并求和成本值
我明白你的需求了——你现在需要把生成的笛卡尔积结果按name、age、expenseN和group这几个维度分组,然后对cost字段求和,得到每个分组的总成本。
最优解决方案:提前分组,避免冗余数据
其实不用先生成大量重复的result列表再处理,我们可以先对InfoDetail做分组求和,再和Info关联,这样效率更高,也更简洁:
// 第一步:对group=x的InfoDetail按expenseN和group分组,计算每个分组的总成本 var groupedDetail = _infoDetailRepository.Query(p => p.group == "x") .GroupBy(d => new { d.expenseN, d.group }) .Select(g => new { expenseN = g.Key.expenseN, group = g.Key.group, totalCost = g.Sum(d => d.cost) }) .ToList(); // 第二步:获取需要的Info数据(这里是name为a和b的记录) var targetInfos = _infoRepository.Query(p => p.name is "a" or "b").ToList(); // 第三步:将每个Info和分组后的Detail关联,生成最终结果 var finalResult = targetInfos.SelectMany(info => groupedDetail.Select(detail => new Info { name = info.name, age = info.age, expenseN = detail.expenseN, cost = detail.totalCost, group = detail.group })).ToList();
如果你已经有了现有的result列表,直接聚合处理
如果因为某些原因你必须保留当前生成result的逻辑,也可以对已有的result做分组求和,快速得到期望结果:
var aggregatedResult = result // 按需要保持唯一的字段分组:name、age、expenseN、group .GroupBy(item => new { item.name, item.age, item.expenseN, item.group }) .Select(g => new Info { name = g.Key.name, age = g.Key.age, expenseN = g.Key.expenseN, cost = g.Sum(item => item.cost), // 对分组内的cost求和 group = g.Key.group }) .ToList();
原理说明
GroupBy的键是一个匿名类型,包含所有需要作为分组依据的字段——这些字段完全相同的条目会被归为同一组。- 然后通过
Sum方法计算每组内cost的总和,再把分组的键值和求和结果映射成新的Info对象,就得到了你想要的聚合结果。
内容的提问来源于stack exchange,提问作者Triet Pham
相关产品推荐
相关产品推荐

