2012-03-20 185 views
3

我想知道为什么GroupBy使用匿名类型。LINQ 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

作为每文档,一个anonymous type is a reference type

从公共语言运行时的角度来看,一个匿名类型是从任何其他引用类型没有什么不同。

因此,将使用如由 System.Object(其中至少为 equality is based on referential equality)中实现这些功能的默认实现。

编辑:其实,按照相同的第一DOCO链接,它说:

因为匿名类型的Equals和GetHashCode方法的Equals和性能的GetHashCode方法的术语定义,两个相同匿名类型的实例只有在它们的所有属性相等时才相等。

0

它不能在OrderBy上工作,因为新对象没有实现IComparable。

+0

不,它不调用'ToString'。它调用'GetHashCode'和'Equals'。 – StriplingWarrior 2012-03-20 19:39:50

+0

我的坏,我删除它。 如何做删除线? OmegaMan 2012-03-20 19:57:01

+0

罢工标签应该在你的实际文章中工作。虽然他们显然在评论中逃脱了。 – StriplingWarrior 2012-03-20 20:13:08