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

要回答您的第一个问题,请在此处查看更多信息。

回答你的第二个问题:你忘了 item2 应该是 item2.itemName

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

Distinct方法的工作原理如下:

  1. 使用 . 检查两个对象是否具有相同的哈希码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 回答