3

IEqualityComparer を実装し、次のメソッドをオーバーライドするクラス MyItems があります。

public bool Equals(MyItems item1, MyItems item2)
{
    return (item1.ID == item2.ID && item1.itemName.Equals(item2));
}
public int GetHashCode(MyItems item)
{
    return item.ID.GetHashCode() ^ item.itemName.GetHashCode();
}

まず、なぜGetHashCode必要なの?Equalsメソッドをオーバーライドすることは理解していますが、そのGetHashCode必要性は私にはわかりませんでした。

第二に、これは機能していないようです。ここで私が間違っていることはありますか?わからないGetHashCode,ところでつまずいているのかもしれません。

4

3 に答える 3

8

最初の質問に答えるには、ここで詳細を確認してください。

2 番目の質問に答えるには: item2 が item2.itemName であることを忘れていました

return (item1.ID == item2.ID && item1.itemName.Equals(item2.itemName));
于 2013-01-02T22:54:09.490 に答える
6

メソッドは次のDistinctように機能します。

  1. を使用して、2 つのオブジェクトのハッシュ コードが同じかどうかを確認しGetHashCodeます。
  2. もしそうなら、絶対に と等しいことを確認してくださいEquals

これGetHashCodeは、より高価なチェックの最初のチェックです。Equals

メソッドEqualsにエラーがあります:

return (item1.ID == item2.ID && item1.itemName.Equals(item2));

次のようにする必要があります。

return (item1.ID == item2.ID && item1.itemName.Equals(item2.itemName));
//                                                         ^^^^^^^^^

また、使用している List または配列型が<MyItems>型でない場合は、Equals メソッドもオーバーライドする必要があります。

于 2013-01-02T22:52:59.510 に答える
1

オブジェクトを比較したい場合はEquals(object obj)、そのクラスでオーバーライドする必要があります。

また、オーバーライドするときはいつでも、オーバーライドEquals(object obj)することをお勧めしますGetHashCode

于 2013-01-02T22:55:06.743 に答える