gpt4 book ai didi

c# - 利用 IEqualityComparer 的 GetHashCode() 部分进行直接比较?

转载 作者:行者123 更新时间:2023-11-30 16:48:47 28 4
gpt4 key购买 nike

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

据我了解,GetHashCode() (fast) 首先被调用,然后是 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 可以利用缓存的哈希码本身并缩短比较。

关于c# - 利用 IEqualityComparer<T> 的 GetHashCode() 部分进行直接比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37724752/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com