You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:18:55