Linq GroupBy 对 类 和值的行为不同

Linq GroupBy behaves differently for classes and values

请考虑以下代码段:

var list = new string[] { "ab", "ab", "cd", "cd", "cd" };
var groups = list.GroupBy(l => l);
var count = groups.Count();

结果:

count: 2,
groups: [{ Key: "ab", elements: ["ab", "ab"] }, { Key: "cd", elements: ["cd", "cd", "cd"] }]

当我对 class X:

做同样的事情时
public class X
{
    public int A { get; set; }
    public string B { get; set; }
}

并且使用相同的算法来创建分组结果:

var list2 = new X[] 
    {
        new X { A = 1, B = "b1" },
        new X { A = 1, B = "b1" },
        new X { A = 2, B = "b2" },
        new X { A = 2, B = "b2" },
        new X { A = 2, B = "b2" },
    };

var groups2 = list2.GroupBy(l => l);
var count2 = groups2.Count();

我希望有同样的行为。我会说 count2 是 2,而 groups2 包含两个不同的不同数据集,分别具有 2 个和 3 个元素。

但是,当我 运行 这样做时,我得到 5 个计数和一个组列表,每个组包含一个项目。为什么会有不同的行为?我希望相同的聚合算法表现相同。

提前感谢您的解释。

GroupBy 对类型使用默认相等比较器,除非您提供任何 implementation.The 仅为引用类型的默认比较器 return 如果它们是相同的实例,则为真,这意味着它们具有相同的引用。如果这不是您想要的行为,您有两个选择:

  1. 重写类中的 EqualsGetHashCode 方法
  2. 实施 IEqualityComparer for your type and pass it to GroupBy