2010-01-29 51 views
6

使用字典时,我总是覆盖GetHashCode和Equals(或提供自定义比较器到字典)。创建匿名类作为字典中的自定义键

当我创建一个匿名类作为关键时会发生什么?

示例代码....

var groups=(from item in items 
       group item by new { item.ClientId, item.CustodianId, item.CurrencyId } 
        into g 
        select new { 
        Key=g.Key,      
        Sum=g.Sum(x => x.Cash) 
        }).ToDictionary(item=>item.Key,item=>item.Sum); 

此代码给了我预期的结果,但我没有提供的GetHashCode和等于该匿名类的方法。 不应该这个代码无法在匿名类中的项目的基础上分组我的项目?

回答

14

不可以 - 匿名类自动生成适当的Equals/GetHashCode实现。

从C#语言规范,部分7.5.10.6:

上 匿名类型的Equals和GetHashCode方法覆盖从对象继承的方法 ,并在的Equals和GetHashCode 的术语被定义 的属性,以便两个 实例的相同匿名类型 相等当且仅当它们的所有属性相同。