利用IEqualityComparer <T>的GetHashCode()部分进行直接比较?

我写了一个派生自IEqualityComparer<T>的类,它对我需要的LINQ查询非常有用。

据我了解,如果哈希码是相同的,则首先调用GetHashCode() (快),然后调用Equals() (稍慢)。

但是,当使用它进行直接比较时,手动使用类似的东西

return new MyIEqualityComparer().Equals(objA,objB);

其中放弃了更快的GetHashCode()相等性检查。 有没有比较objAobjB ,它不会自动跳过更快的GetHashCode()检查?

我想我希望objA.Equals()会有一个接受从IEqualityComparer<T>派生的参数的重载。


计算散列码并比较散列通常比直接比较相等要慢。 这是额外的工作。

哈希代码用于支持散列表的O(1)行为。 他们将一个对象映射到哈希表工作所需的数字。 哈希代码对于简单的平等比较没有帮助。

只需使用Equals

如果你想知道如何最好地实现你的想法(尽管这不是一个好主意),我会使用一个辅助方法:

static bool ExperimentalEquals<T>(T a, T b, IEqualityComparer<T> c) {
 if (c.GetHashCode(a) != c.GetHashCode(b)) return false;
 return c.Equals(a, b);
}

(仅用于教育目的。)

您可能会认为,如果使用缓存哈希代码,实际上可能会更快。 但是, Equals可以使用缓存的哈希码本身并短路比较。


你不清楚你在这里做什么,但你总是可以实现IEquatable<T>并委托给MyIEqualityComparer ,从而使用更快的GetHashCode()

class My : IEquatable<My>
{
    public bool Equals(My other)
    {
        return new MyIEqualityComparer().Equals(this, other);
    }
}
链接地址: http://www.djcxy.com/p/6769.html

上一篇: Utilizing the GetHashCode() part of IEqualityComparer<T> for direct comparisons?

下一篇: What is f(n), g(n) and real constant in The Big