.net IEnumerable除了自定义IEqualityComparer没有按预期工作

时间:2017-02-01 15:57:53

标签: c# .net linq

我目前对IEnumerable.Except()方法有点困惑。我试图在Objects的数据id上执行set操作。所以,我写了一个自定义的Equality Comparer。但结果完全不是我的预期。 例子:

setLanguageHandler

输出如下: 43 42 43

但我本以为是 43 43

为什么我的假设错了?

brgds Sven Weiberg

1 个答案:

答案 0 :(得分:7)

原因是您GetHashCode()的实施。它为您的所有DataStructure实例提供了不同的哈希码。

将其更改为:

public int GetHashCode(DataStructure obj)
{
    return obj.DataID;
}

为了提高性能,Except首先会比较对象的哈希码。只有它们相等时,它才会调用Equals以确定对象是否真的相等的意思相同。

不同的哈希值告诉它对象不相等。并且您使用object.GetHashCode()的基本实现,它将主要为不同的实例提供不同的值

由于您的相等性由DataID属性决定,因此将此值用作哈希码也是有意义的。