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 如果它们是相同的实例,则为真,这意味着它们具有相同的引用。如果这不是您想要的行为,您有两个选择:
- 重写类中的
Equals
和 GetHashCode
方法
- 实施
IEqualityComparer
for your type and pass it to GroupBy
请考虑以下代码段:
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 如果它们是相同的实例,则为真,这意味着它们具有相同的引用。如果这不是您想要的行为,您有两个选择:
- 重写类中的
Equals
和GetHashCode
方法 - 实施
IEqualityComparer
for your type and pass it toGroupBy