繁体   English   中英

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

[英]Utilizing the GetHashCode() part of IEqualityComparer<T> for direct comparisons?

我编写了一个派生自IEqualityComparer<T> ,它非常适合我需要它的LINQ查询。

据我了解,首先调用GetHashCode() (fast),然后调用Equals() (稍慢),如果hashcode相同,则进行此类操作。

然而,当手动使用它进行直接比较时,我正在使用类似的东西

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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM