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

时间:2016-06-09 11:30:56

标签: c# iequalitycomparer

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

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

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

的东西
return new MyIEqualityComparer().Equals(objA,objB);

放弃GetHashCode()等同性检查更快。有没有办法比较objAobjB哪个不会自动跳过更快GetHashCode()的检查?

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

2 个答案:

答案 0 :(得分:2)

计算哈希码并比较哈希值通常比直接比较哈希值慢。它的额外工作。

哈希代码用于支持哈希表的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可以使用缓存的哈希代码本身并使比较短路。

答案 1 :(得分:0)

目前还不清楚你在做什么,但是你总是可以实施IEquatable<T>并委托给console.log('a 15.33 320 15.33 c 148.66 148.66 999.999'.replace(/\d*\.\d*/g, function (v) { return Math.round(v); }));,因此使用更快MyIEqualityComparer

GetHashCode()