Tra*_*rks 5 linq group-by anonymous-types
我想知道为什么 GroupBy 使用匿名类型。
List<string> values = new List<string>();
values.GroupBy(s => new { Length = s.Length, Value = s })
Run Code Online (Sandbox Code Playgroud)
匿名类型不实现任何接口,所以我很困惑这是如何工作的。
我假设该算法是通过为源中的每个项目创建匿名类型的实例并使用散列将项目组合在一起来工作的。但是,没有提供 IEqualityComparer 来定义如何生成哈希或两个实例是否相等。那么,我会假设 Object.Equals 和 Object.GetHashCode 方法将是后备方法,它们依赖于对象标识。
那么,这是如何按预期工作的呢?但它在 OrderBy 中不起作用。匿名类型会覆盖 Equals 和 GetHashCode 吗?或者底层的 GroupBy 算法是否做了一些我没有想到的魔法?
根据文档,匿名类型是引用类型:
从公共语言运行库的角度来看,匿名类型与任何其他引用类型没有区别。
因此,它将使用System.Object实现的那些函数的默认实现(至少对于相等性基于引用相等性)。
编辑:实际上,根据相同的第一个 doco 链接,它说:
因为匿名类型的 Equals 和 GetHashCode 方法是根据属性的 Equals 和 GetHashcode 方法定义的,所以只有当它们的所有属性都相等时,同一匿名类型的两个实例才相等。