【解決方法】iEqualitycomparer で gethashcode を使用する理由

プログラミングQA


iEqualityComparer に関しては、 GetHashCode の使用法に関する記事をたくさん読みました。 なぜそれが必要なのかはどこにも明記されていません。 誰かここで私を助けてくれませんか。

以下のコードを試してみました。 私のequalsメソッド自体が比較を行っているので、GetHashCodeの重要性は何ですか?

私が知っているのは、オブジェクト/変数を作成すると、ハッシュコード/固有のコードが作成されるということです。 元のとき

Class Customer
{
public int Id;
}

顧客 c1 = 新しい顧客();

Customer c2 = new customer();
c1.value = 10;

c1.value = 10;

現在、GetHashCode は両方とも異なりますが、値は同じです。 GetHashCode がどこで役立つかわからないですか?

この場合

私が試したこと:

public class MyClass : System.Collections.Generic.EqualityComparer < MyObject > 
{ 
   public bool Equals(MyObject x, MyObject y) 
   { 
      return x.Equals(y); 
   } 
   public int GetHashCode(MyObject obj) 
   { 
      return obj.GetHashCode(); 
   } 
} 

解決策 1

解決策 2

私はポスターに同意します。 答えは不正解です。 これは、ハッシュのプロパティを知ることとは何の関係もありません。これは、IEqualityComparer が実装する「契約」に関係します。 その実装は間違っています! なぜ? Equals 関数は、クラスの意図どおりの動作、つまり同じクラスの 2 つのオブジェクトを比較するためです。 GetHashCode 関数は、この操作をクラスから取り除き、外部エンティティが 2 つのハッシュ コードが等しいかどうかを判断できるようにします。 ハッシュは近似値であるため、x == y は x.hash == y.hash と同じではありません。 これはすべてのコンピュータ科学者が理解すべきことです。 私が考えられる唯一の回避策は、すべてのハッシュ値を強制的に同じ、つまりゼロにして、コンシューマにequalsメソッドの呼び出しを強制することです。

これが理解できない場合は、クラス A から派生したクラス B を考えてください。 A の値が集合 { a, b, c } 内にあるかどうかを知りたいのですが、 b は A から派生したクラス B ですが、検索しようとしているプロパティ ieaproperty == find.property… しかし、b をハッシュすると、それは考慮したくないプロパティを含むすべての値のハッシュになるため、GetHashCode は、equalitycomparer コントラクトを提供できません。 これは単なる愚かな実装です。

コメント

タイトルとURLをコピーしました