对实现大量 IEqualityComparers 有点懒惰,并且鉴于我无法轻松编辑被比较对象的类实现,我选择了以下内容,旨在与 Distinct() 和 except() 扩展方法一起使用。:
public class GenericEqualityComparer<T> : IEqualityComparer<T>
{
Func<T, T, bool> compareFunction;
Func<T, int> hashFunction;
public GenericEqualityComparer(Func<T, T, bool> compareFunction, Func<T, int> hashFunction)
{
this.compareFunction = compareFunction;
this.hashFunction = hashFunction;
}
public bool Equals(T x, T y)
{
return compareFunction(x, y);
}
public int GetHashCode(T obj)
{
return hashFunction(obj);
}
}
看起来不错,但是每次都提供哈希函数真的有必要吗?我了解哈希码用于将对象放入存储桶中。不同的bucket,object不相等,不调用equal。
如果 GetHashCode 返回相同的值,则调用 equals。(来自:为什么在重写 Equals 方法时重写 GetHashCode 很重要?)
那么,例如(我听到很多程序员惊恐地尖叫),GetHashCode 返回一个常量,强制调用 Equal 会出现什么问题?