2

メソッドをオーバーライドEqual(Object comparee)しましたが、HashSetにオブジェクトを追加しても、doubleが返されます。私は何を取りこぼしたか?MyTypeタイプには2つのフィールドが含まれていますint(たとえば)。HashSetおそらく、間違ったコレクションタイプですか?

いくつかのものを追加したいのMyTypeですが、コレクションに一意のものだけが保存されるようにします。ここで、一意は私が定義します(Equalsメソッドまたはその他の方法を使用)。

4

2 に答える 2

3

GetHashCode()オーバーライドするときは、常にオーバーライドする必要がありますEquals()。私は通常、そのメソッドに対して、可能な場合は何らかの主キーを返します。それ以外の場合は、実装のアイデアについてこのスレッドを確認してください。

これら 2 つの方法の関係を理解するための鍵は、次のとおりです。

  • 2 つのエントリのハッシュ コードが異なる場合、それらは完全に等しくありません。
  • 2 つのエントリが同じハッシュ コードを持っている場合、それらは等しい可能性があるため、呼び出し Equals()て確認してください。
于 2012-08-06T16:55:53.363 に答える
2

GetHashCode()同様にオーバーライドする必要があります。そうしないと、オブジェクトのハッシュコードが異なるため、自動的に異なると見なされます。オブジェクトから独自の値を取得し、可能な場合はそれを使用するか、独自の値を生成します。

また、怠惰にならず、それらすべてに同じハッシュコードを使用してください。それはの目的を打ち負かしHashSetます。

したがって、2つのintフィールドがある例では、次のようになります。

public override int GetHashCode() {
    return field1 ^ field2;
}
于 2012-08-06T16:55:05.690 に答える