我的List <T> .Distinct()有什么问题?

B-R*_*Rad 3 c# wpf overriding gethashcode

我有一个实现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();
}
Run Code Online (Sandbox Code Playgroud)

首先,为什么有GetHashCode必要?我理解压倒这种Equals方法,然而,GetHashCode我的必要性已经无法实现.

其次,这似乎不起作用.我有什么问题吗?在那里我不明白GetHashCode,那可能是我绊倒的地方.

Iro*_*n84 8

要回答您的第一个问题,请查看此处以获取更多信息.

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

return (item1.ID == item2.ID && item1.itemName.Equals(item2.itemName));
Run Code Online (Sandbox Code Playgroud)


gdo*_*ica 6

Distinct方法的工作原理如下:

  1. 检查两个对象是否具有相同的哈希码GetHashCode.
  2. 如果他们这样做,现在确保他们绝对等于Equals.

GetHashCode是对更昂贵的支票的第一次检查:Equals

您的Equals方法有错误:

return (item1.ID == item2.ID && item1.itemName.Equals(item2));
Run Code Online (Sandbox Code Playgroud)

应该:

return (item1.ID == item2.ID && item1.itemName.Equals(item2.itemName));
//                                                         ^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

此外,如果您使用的List或数组类型不是<MyItems>类型,则还需要覆盖Equals方法.