LINQ GroupBy 匿名类型

5

我想知道为什么使用匿名类型可以实现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个回答

5
根据文档,匿名类型是引用类型

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

因此,它将使用默认实现来执行那些由System.Object实现的函数(至少对于相等性是基于引用相等性的情况)。

编辑:实际上,根据同样的第一个文档链接,它说:

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


0

0

在OrderBy上它不起作用,因为新对象没有实现IComparable接口。


不,它并没有调用 ToString。它在调用 GetHashCodeEquals - StriplingWarrior
我的错,我已经删除了它。<strike>怎么划掉文字?</strike> - ΩmegaMan
删除标签应该在您实际的帖子中正常工作。但是,在评论中它们似乎被转义了。 - StriplingWarrior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接