如何合并两个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
相关产品推荐
相关产品推荐

