LINQ GroupBy匿名类型

时间:2012-03-20 19:16:14

标签: linq group-by anonymous-types

我想知道为什么GroupBy使用匿名类型。

List<string> values = new List<string>();
values.GroupBy(s => new { Length = s.Length, Value = s })

匿名类型没有实现任何接口,所以我很困惑这是如何工作的。

我假设算法正在通过为源中的每个项创建匿名类型的实例并使用散列将项组合在一起来工作。但是,没有提供IEqualityComparer来定义如何生成散列或两个实例是否相等。那么,我认为Object.Equals和Object.GetHashCode方法将是后备,它依赖于对象标识。

那么,这是如何按预期工作的呢?然而它在OrderBy中不起作用。匿名类型是否重写Equals和GetHashCode?或者底层的GroupBy算法是否做了一些我没有想过的魔法?

3 个答案:

答案 0 :(得分:3)

根据文档,anonymous type is a reference type

  

从公共语言运行库的角度来看,匿名类型与任何其他引用类型没有区别。

因此,它将使用System.Object实现的那些函数的默认实现(至少对equality is based on referential equality实现)。

编辑:实际上,根据相同的第一个doco链接,它说:

  

因为匿名类型上的Equals和GetHashCode方法是根据属性的Equals和GetHashcode方法定义的,所以同一匿名类型的两个实例只有在它们的所有属性相等时才相等。

答案 1 :(得分:0)

http://msdn.microsoft.com/en-us/library/bb397696.aspx

此链接说明GetHashCode和Equals 已被覆盖。

答案 2 :(得分:0)

它不适用于OrderBy,因为新对象不实现IComparable。