LINQGroupBy匿名类型

LINQGroupBy匿名类型,linq,group-by,anonymous-types,Linq,Group By,Anonymous Types,我想知道为什么GroupBy使用匿名类型 List<string> values = new List<string>(); values.GroupBy(s => new { Length = s.Length, Value = s }) 列表值=新列表(); GroupBy(s=>new{Length=s.Length,Value=s}) 匿名类型不实现任何接口,所以我不知道这是如何工作的 我假设该算法通过为源中的每个项创建匿名类型的实例并使用哈希将这些项分

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

List<string> values = new List<string>();
values.GroupBy(s => new { Length = s.Length, Value = s })
列表值=新列表();
GroupBy(s=>new{Length=s.Length,Value=s})
匿名类型不实现任何接口,所以我不知道这是如何工作的

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


那么,这是如何按照预期工作的呢?但它在OrderBy中不起作用。匿名类型是否覆盖Equals和GetHashCode?或者底层的GroupBy算法是否发挥了我没有想到的魔力?

根据文档,一个:

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

因此,对于由实现的那些函数,它将使用默认实现(至少对于)

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

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


此链接说明GetHashCode和Equals被重写。

它在OrderBy上不起作用,因为新对象未实现IComparable

不,它没有调用
ToString
。它正在调用
GetHashCode
Equals
。糟糕,我把它删除了。如何删除?删除标签应该在你的实际帖子中起作用。不过,他们显然在评论中逃脱了。