10

辞書を使用している間、私は常に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メソッドとEqualsメソッドを提供していません。このコードは、匿名クラスのアイテムに基づいてアイテムをグループ化するのに失敗するべきではありませんか?

4

1 に答える 1

18

いいえ-匿名クラスは、適切なEquals/GetHashCode実装を自動的に生成します。

C#言語仕様のセクション7.5.10.6から:

匿名型のEqualsメソッドとGetHashcodeメソッドは、オブジェクトから継承されたメソッドをオーバーライドし、プロパティのEqualsメソッドとGetHashcodeで定義されるため、同じ匿名型の2つのインスタンスは、すべてのプロパティが等しい場合にのみ等しくなります。

于 2010-01-29T09:43:53.447 に答える