为什么GroupBy中的键入和匿名键选择器会产生不同的结果?

时间:2016-12-09 05:53:10

标签: c# linq

我不知道为什么我在以下两个GroupBy()查询中获得了不同的结果。我希望它们都返回3个分组,但键入的键选择器GroupBy()返回4。

给出一个关键类:

class Key
{
    public int Day { get; set; }
}

当我跑步时:

var data = new[]
{
    new { Date = DateTime.Now },
    new { Date = DateTime.Now },
    new { Date = DateTime.Now.AddDays(1) },
    new { Date = DateTime.Now.AddDays(2) }
};

var groupsByAnonymousKey = data.GroupBy(m => new
{
    m.Date.DayOfYear
});

var groupsByTypedKey = data.GroupBy(m => new Key
{
    Day = m.Date.DayOfYear
});

var anonymousCount = groupsByAnonymousKey.Count(); // 3
var typedCount = groupsByTypedKey.Count();         // 4

anonymousCount为3,typedCount为4。

2 个答案:

答案 0 :(得分:2)

因为在第二个版本中,您按分组:Key。类实例彼此不相等,即使它们的所有属性相等,而不是 anonumous 类型。因此typedCount始终相等data.Length。要解决此问题,您可以在comparer运算符的其他版本指定GroupBy或覆盖Equals类的GetHashCodeKey方法,也可以更改{{ 1}}类到Key

答案 1 :(得分:0)

可能是因为同一天的两个不同Key对象的GetHashCode不同。你能尝试覆盖GetHashCode并在同一天返回它吗?