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

如何合并两个List并生成含重复值求和的新对象列表?

处理含重复Id的集合合并方案

核心思路分两步:先对enumerable2按Id分组求和,再与enumerable1关联计算最终结果。

步骤1:预处理enumerable2,合并重复Id的Value

用LINQ的GroupBy按Id分组,再对每组的Value求和,得到每个Id对应的总Value:

var groupedEnumerable2 = enumerable2
    .GroupBy(item => item.Id)
    .Select(group => new 
    { 
        Id = group.Key, 
        TotalValue = group.Sum(item => item.Value) 
    });

步骤2:与enumerable1合并计算

根据需求不同,有两种常见处理场景:

场景1:仅保留enumerable1中的Id

用左连接(join ... into + DefaultIfEmpty())确保enumerable1的所有条目都被保留,即使enumerable2中没有对应Id时也能正常计算:

var mergedList = from e1 in enumerable1
                 join e2 in groupedEnumerable2 on e1.Id equals e2.Id into matchedGroups
                 from matchedItem in matchedGroups.DefaultIfEmpty()
                 select new 
                 { 
                     Id = e1.Id, 
                     TotalValue = e1.Value + (matchedItem?.TotalValue ?? 0) 
                 };

场景2:保留所有出现过的Id(包括仅在enumerable2中的)

如果需要包含enumerable2中存在但enumerable1中没有的Id,可以将两个集合的条目合并后再分组求和:

var mergedList = enumerable1
    .Select(e1 => new { e1.Id, Value = (decimal)e1.Value }) // 统一数值类型避免溢出
    .Concat(groupedEnumerable2.Select(e2 => new { e2.Id, Value = e2.TotalValue }))
    .GroupBy(item => item.Id)
    .Select(group => new 
    { 
        Id = group.Key, 
        TotalValue = group.Sum(item => item.Value) 
    })
    .ToList();

示例验证

假设输入数据:

var enumerable1 = new[]
{
    new { Id = 1, Value = 10 },
    new { Id = 2, Value = 20 },
    new { Id = 3, Value = 30 }
};

var enumerable2 = new[]
{
    new { Id = 1, Value = 5 },
    new { Id = 1, Value = 7 },
    new { Id = 2, Value = 3 },
    new { Id = 4, Value = 15 }
};
  • 场景1输出:
    • { Id = 1, TotalValue = 22 }(10+5+7)
    • { Id = 2, TotalValue = 23 }(20+3)
    • { Id = 3, TotalValue = 30 }(30+0)
  • 场景2输出:在场景1基础上增加{ Id = 4, TotalValue = 15 }(0+15)

内容的提问来源于stack exchange,提问作者user8512043

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:20:42