.NET Core中GroupBy失效:分组后列表与原列表数量一致
解决LINQ GroupBy使用自定义类作为键时的分组失效问题
问题出在自定义类的相等性判断逻辑上。默认情况下,GroupClass是引用类型,LINQ的GroupBy在比较分组键时,会使用引用相等性(即判断两个对象是否是同一个实例),而不是比较属性值。所以你每次new GroupClass { PropA = a }都会创建一个新对象,哪怕PropA的值相同,这些对象的引用也不一样,最终导致每个元素都被分到单独的组里。
解决方案1:改用匿名类型作为分组键
匿名类型默认会重写Equals和GetHashCode方法,会按属性值来判断相等性,直接替换即可:
int[] testArray = { 1, 2, 3, 3, 3, 3, 3, 3 }; var result = (from a in testArray group a by new { PropA = a } into g select new ModelClass { PropA = g.Key.PropA, }).ToList(); Console.WriteLine(result.Count); // 输出3,符合预期
解决方案2:给GroupClass重写Equals和GetHashCode方法
如果必须使用自定义类作为分组键,需要手动实现基于属性值的相等判断:
public class GroupClass { public int PropA { get; set; } public override bool Equals(object obj) { return obj is GroupClass other && PropA == other.PropA; } public override int GetHashCode() { return HashCode.Combine(PropA); } }
修改后再运行你的原代码,就能得到正确的分组结果。
解决方案3:实现IEquatable接口
这是更类型安全的方式,避免object类型转换的开销:
public class GroupClass : IEquatable<GroupClass> { public int PropA { get; set; } public bool Equals(GroupClass other) { if (other is null) return false; return PropA == other.PropA; } public override bool Equals(object obj) => Equals(obj as GroupClass); public override int GetHashCode() => HashCode.Combine(PropA); }
以上三种方案都能解决你的分组失效问题,根据实际场景选择即可。
内容的提问来源于stack exchange,提问作者Lazar Đorđević
相关产品推荐
相关产品推荐

