如何按多个属性对List<ClassName>列表进行汇总统计?
C# 按指定属性汇总List列表
基础实现:使用LINQ GroupBy + Select
直接通过匿名类型指定分组的属性(比如Typ和Name),然后对每组的Amount求和,生成汇总后的列表:
首先修正原代码的变量名和字符串赋值问题:
List<ClassName> list = new List<ClassName>(); list.Add(new ClassName() { Typ = 1, Name = "A", Amount = 5 }); list.Add(new ClassName() { Typ = 2, Name = "B", Amount = 3 }); list.Add(new ClassName() { Typ = 1, Name = "A", Amount = 3 }); list.Add(new ClassName() { Typ = 1, Name = "C", Amount = 3 });
然后执行汇总逻辑:
using System.Linq; // 需引用LINQ命名空间 var summarizedList = list // 按Typ和Name分组,匿名类型会自动比较所有属性值 .GroupBy(item => new { item.Typ, item.Name }) .Select(group => new ClassName() { Typ = group.Key.Typ, Name = group.Key.Name, Amount = group.Sum(item => item.Amount), // 汇总Amount // 如果有其他需保留的相同属性,直接取组内第一个元素的对应值即可 // OtherProperty = group.First().OtherProperty }) .ToList();
进阶实现:自定义相等比较器(适用于多属性分组或复用逻辑)
如果需要分组的属性较多,或者后续要复用分组规则,可以自定义IEqualityComparer:
public class ClassNameEqualityComparer : IEqualityComparer<ClassName> { public bool Equals(ClassName x, ClassName y) { if (x == null || y == null) return x == y; // 定义判断"相同"的属性集合,这里是Typ和Name,可按需添加其他属性 return x.Typ == y.Typ && x.Name == y.Name; } public int GetHashCode(ClassName obj) { if (obj == null) return 0; // 组合属性的哈希码,确保相同属性组合的哈希值一致 return HashCode.Combine(obj.Typ, obj.Name); } }
使用该比较器进行分组汇总:
var summarizedList = list .GroupBy(item => item, new ClassNameEqualityComparer()) .Select(group => new ClassName() { Typ = group.Key.Typ, Name = group.Key.Name, Amount = group.Sum(item => item.Amount) }) .ToList();
注意事项
- 如果同一分组内除
Amount外的其他属性存在不同值,使用group.First()取属性值时需符合业务预期,若有特殊需求可替换为Max/Min或其他聚合逻辑。 - 确保已引用
System.Linq命名空间,否则无法使用LINQ扩展方法。
内容的提问来源于stack exchange,提问作者Ramenmaestro
相关产品推荐
相关产品推荐

