Linq GroupBy对类和值的行为有所不同

时间:2015-02-25 23:00:59

标签: c# linq grouping

请考虑以下代码段:

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作为计数和一个包含每个项目的组的列表。为什么不同的行为?我希望相同的聚合算法表现相同。

提前感谢您的解释。

1 个答案:

答案 0 :(得分:2)

除非您提供任何实现,否则

GroupBy对类型使用默认的相等比较器。如果引用类型的默认比较器是相同的实例,则它们将返回true,这意味着它们具有相同的引用。如果这不是你想要的行为,你有两个选择:

  1. 覆盖你的clas中的EqualsGetHashCode方法
  2. 为您的类型实施IEqualityComparer并将其传递给GroupBy