1

C# HashSet は、要素を別のコレクションと比較する必要がある ExceptWith(...) などの多くの集合演算子を定義します。これらのメソッドは、比較しているオブジェクトの HashCode に基づいて機能しますか? それとも Equals() を使用していますか?

4

1 に答える 1

4

ハッシュコードに関係するものはすべて、 と の両方を使用する必要があります(GetHashCode候補Equals値で直接呼び出すか、 を介して呼び出すかIEqualityComparer<T>)。

ハッシュ コードが一意であるとは限りません。事実上、ハッシュ コードは単なる初期フィルターです。2 つのオブジェクトが等しい場合、それらのハッシュ コードは同じでなければなりません...しかし、ハッシュ コードが同じだからといって、それらが確実に等しいというわけではありません。

ハッシュ コードは、一致する可能性のある大規模なセットを、同じハッシュ コードを持つ非常に小さな候補セットに非常に迅速に絞り込むために使用されます。(ハッシュ セットは要素とそのハッシュ コードの両方を記憶しているため、毎回再計算することなくハッシュ コードをチェックできます。)次に、各候補を順番にチェックして、それEquals本当に一致するかどうかを判断する必要があります。

と で同じロジックが使用されHashTableDictionaryいますが、実装に微妙な違いがある可能性があります。(ハッシュ テーブルに関するウィキペディアの記事には、いくつかのバリエーションがリストされています。)

于 2013-05-01T20:31:07.193 に答える