8

名前空間のIEqualityComparerSystem.Collections.Genericには、次のメソッドがあります。

bool Equals(T x, T y);
int GetHashCode(T obj);

このインターフェイスはオブジェクトの等価性をチェックするために使用されるため、最初の方法Equalsが理にかなっています。しかし、なぜ実装する必要があるのGetHashCodeでしょうか。そもそもなぜインターフェースに存在するのですか?いつ、なぜ必要なのですか?

名前空間のEnumerable.Distinct()メソッドで使用してSystem.LinqGetHashCode()ますEquals()。なんで?どのように機能しDistinctますか?

4

4 に答える 4

8

動作の詳細Distinct(または少なくとも単純な実装例) については、私のEdulinq ブログ投稿( old - 404 ) を参照してください。

簡単に言えば、適切な等値比較に対応するハッシュ コードにより、一連のアイテムの作成が安価になります。これは、、、、 、、など、多くの状況で役立ちます。DistinctExceptIntersectUnionJoinGroupJoinGroupByToLookup

于 2011-02-24T12:37:38.980 に答える
1

GetHashCodeなどで検索を最適化するためにHashTables使用されます。Dictionariesここを見てください:http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

于 2011-02-24T12:35:59.573 に答える
0

IEqualityComparer(Of T) の目的は、デフォルトの Object.Equals とは意味的に異なる比較メソッドを使用できるようにすることです。これにより、Object.Equals が異なると見なした場合でも、2 つのオブジェクトが等しいと見なされる可能性があります。等しいオブジェクトは等しいハッシュ コードを持つ必要があり、EqualityComparer の Equals メソッドが等しいと見なし、Object.Equals が等しくないと見なすものは異なるハッシュ コードを持つ可能性があるため、EqualityComparer が別のハッシュ コーディング メソッドを使用する必要があります。

IEquatable(Of T) には、さらに興味深い状況が存在します。Object.Equals がそれらを等しくないと報告した場合、2 つのオブジェクトが等しいと報告されることは決してないと予想されます。封印されていないクラスが IEquatable(Of T) を実装するのは危険です。残念ながら、封印されていないクラスの使用を禁止する一般的な制約はありません。

于 2011-02-24T16:02:53.317 に答える
0

Equals() および演算子 == をオーバーライドするためのガイドライン (C# プログラミング ガイド)には次のように記載されているためです。

Equals をオーバーライドするクラスは、Object.GetHashCode もオーバーライドすることをお勧めします。

これは、Hashtables などが、等しい 2 つのオブジェクトが同じハッシュコードを持つことを想定しているためです。

于 2011-02-24T12:38:40.040 に答える