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

.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ć

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:35:38