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

C# 利用IEqualityComparer的GetHashCode()部分<;T>;直接比较?,c#,iequalitycomparer,C#,Iequalitycomparer,我已经编写了一个派生自IEqualityComparer的类,它非常适合我所需要的LINQ查询 据我所知,对于此类操作,首先调用GetHashCode()(fast),然后调用Equals()(稍微慢一点),如果hashcode相同 然而,当手动使用它进行直接比较时,我使用的是 return new MyIEqualityComparer().Equals(objA,objB); 它放弃了更快的GetHashCode()相等性检查。有没有一种方法可以将objA与objB进行比较,而不会自动跳过

我已经编写了一个派生自
IEqualityComparer
的类,它非常适合我所需要的LINQ查询

据我所知,对于此类操作,首先调用
GetHashCode()
(fast),然后调用
Equals()
(稍微慢一点),如果hashcode相同

然而,当手动使用它进行直接比较时,我使用的是

return new MyIEqualityComparer().Equals(objA,objB);
它放弃了更快的
GetHashCode()
相等性检查。有没有一种方法可以将
objA
objB
进行比较,而不会自动跳过更快的
GetHashCode()
检查


我想我希望
objA.Equals()
会有一个重载,它可以接受从
IEqualityComparer
派生的参数。现在还不清楚您在这里要做什么,但您可以始终实现并委托给
MyIEqualityComparer
,从而使用更快的
GetHashCode()

我的类:IEquatable
{
公共布尔等于(我的另一个)
{
返回新的MyIEqualityComparer().Equals(this,other);
}
}

计算哈希代码并比较哈希通常比直接比较相等慢。这是额外的工作

哈希代码支持哈希表的
O(1)
行为。它们将对象映射到哈希表工作所需的数字。散列码对于仅仅进行相等比较是没有帮助的

只需使用
等于

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

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);
}
静态布尔实验质量(TA、TB、IEqualityComparer c){
如果(c.GetHashCode(a)!=c.GetHashCode(b))返回false;
返回c等于(a,b);
}
(仅用于教育目的。)


您可能会认为,在缓存哈希代码的情况下,这实际上可以更快。但是
Equals
可以利用缓存的哈希代码本身并缩短比较过程。

您是否有要解决的性能问题,或者这只是“优化”?GetHashCode并不能证明相等,它可以让您在哈希表(字典或哈希集)中找到项属于哪个存储桶,因此,它可以对更少的项而不是整个集合执行实际的相等性检查。它的主要目的是将对象放入哈希表中,我不认为您可以保证它是否更快。非平凡情况下的相等比较调用起来应该比GetHashCode便宜。如果您检查两个字符串是否相等,则如果长度不同,它可以进行快捷操作,但如果您比较哈希代码,它必须首先对整个字符串进行哈希运算。
Equals
不必较慢。你从哪儿弄来的?我想您可能读过一些字典结构,它们解释了散列如何显著提高访问能力(定位bucket,然后对该bucket中的每个项使用
Equals
),但在比较两个对象时,这种增益不会自动转换。当重载相等时,在两个对象上使用
GetHashCode
可以更快(当然,仅限于不相等的快捷方式),如果对象的比较速度特别慢,但可以快速散列。至少可以说,这在实践中并不经常发生。
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);
}