C#中合并列表重复对象:按指定列求和Amount的Value值
C# 合并相同Column1/Column2记录并累加Amount.Value的实现方案
核心思路
用LINQ的GroupBy方法按Column1和Column2分组,对每组内的Amount.Value进行求和聚合,而非单纯去重。
步骤实现
定义对应实体类
先匹配数据结构创建实体类:public class AmountItem { public decimal Value { get; set; } } public class Record { public List<AmountItem> Amount { get; set; } public string Column1 { get; set; } public string Column2 { get; set; } }编写合并逻辑
通过GroupBy分组后,对每组的数值进行聚合:// 示例原始数据 var originalList = new List<Record> { new Record { Amount = new List<AmountItem> { new AmountItem { Value = 10 } }, Column1 = "Objective 1", Column2 = "6789" }, new Record { Amount = new List<AmountItem> { new AmountItem { Value = 10 } }, Column1 = "Objective 1", Column2 = "6789" } }; // 合并逻辑 var mergedList = originalList // 按Column1和Column2的组合值分组 .GroupBy(record => new { record.Column1, record.Column2 }) .Select(group => new Record { Column1 = group.Key.Column1, Column2 = group.Key.Column2, // 累加分组内所有记录的Amount.Value总和 Amount = new List<AmountItem> { new AmountItem { Value = group.Sum(r => r.Amount.Sum(a => a.Value)) } } }) .ToList();
关键说明
GroupBy使用匿名类型作为分组键,确保只有Column1和Column2完全相同时才会被分到同一组。- 内层
r.Amount.Sum(a => a.Value)处理单条记录中Amount列表的多值求和,外层group.Sum(...)处理分组内所有记录的总和。 - 此方案无需额外判断列表长度,1条记录时分组后仍返回原记录,2条及以上时自动合并聚合。
为什么Distinct()不适用
Distinct()的核心是去重:默认按对象引用比较(类类型),即使重写Equals和GetHashCode实现值比较,也只能保留唯一记录,无法对Amount.Value进行累加操作,完全不满足聚合需求。
内容的提问来源于stack exchange,提问作者Karthikeyan Sivakumar
相关产品推荐
相关产品推荐

