利用IEqualityComparer 的GetHashCode()部分进行直接比较?
我编写了一个派生自IEqualityComparer
,它非常适合我需要它的LINQ查询。
据我了解,首先调用GetHashCode()
(fast),然后调用Equals()
(稍慢),如果hashcode相同,则进行此类操作。
然而,当使用它进行直接比较时,手动,我正在使用类似的东西
return new MyIEqualityComparer().Equals(objA,objB);
放弃了更快的GetHashCode()
相等性检查。 有没有办法比较objA
到objB
哪个不会自动跳过更快的GetHashCode()
检查?
我想我希望objA.Equals()
有一个重载接受从IEqualityComparer
派生的参数。
计算哈希码并比较哈希值通常比直接比较哈希值要慢。 这是额外的工作。
哈希代码用于支持哈希表的O(1)
行为。 它们将对象映射到哈希表工作所需的数字。 哈希码对单纯的比较没有帮助。
只需使用Equals
。
如果你想知道如何最好地实现你的想法(虽然这不是一个好主意)我会使用一个帮助方法:
static bool ExperimentalEquals(T a, T b, IEqualityComparer c) { if (c.GetHashCode(a) != c.GetHashCode(b)) return false; return c.Equals(a, b); }
(仅用于教育目的。)
您可能认为在缓存哈希代码的情况下,这实际上可能更快。 但是Equals
可以利用缓存的哈希代码本身并使比较短路。
目前还不清楚你在做什么,但是你总是可以实现IEquatable
并委托给MyIEqualityComparer
,因此使用更快的GetHashCode()
:
class My : IEquatable { public bool Equals(My other) { return new MyIEqualityComparer().Equals(this, other); } }