请考虑以下代码段:
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"] }]
当我为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作为计数和一个包含每个项目的组的列表。为什么不同的行为?我希望相同的聚合算法表现相同。
提前感谢您的解释。
答案 0 :(得分:2)
GroupBy
对类型使用默认的相等比较器。如果引用类型的默认比较器是相同的实例,则它们将返回true,这意味着它们具有相同的引用。如果这不是你想要的行为,你有两个选择:
Equals
和GetHashCode
方法IEqualityComparer
并将其传递给GroupBy