在IComparer的情况下,哪个GetHashcode将占主导地位

本文关键字:GetHashcode 占主导地位 哪个 IComparer 情况下 | 更新日期: 2023-09-27 17:57:27

我遇到以下情况

class Custom
{
    public override int GetHashCode(){...calculation1}
}
public class MyComparer : IEqualityComparer<Custom>
{
    public bool Equals(Custom cus1, Custom cus2)
    {
        if (cus1 == null || cus2 == null)
            return false;
        return cus1.GetHashCode() == cus2.GetHashCode();
    }
    public int GetHashCode(Custom cus1)
    {
        return ...calculation2;
    }
}
int Main()
{
    List<Custom> mine1 = new List<Custom>(){....};
    List<Custom> mine2 = new List<Custom>(){....};
    MyComparer myComparer = new MyComparer();
    List<Custom> result = mine1.intersect(mine2,myComparer);
}

在这里,我只是想知道哪个GetHashCode将用于相交。

在IComparer的情况下,哪个GetHashcode将占主导地位

要回答您的问题,请使用MyComparer中的GetHashCode。

但是,存在GetHashCodeEquals方法有一个非常重要的原因GetHashCode()是一个优化,因此在最初比较项目时,只检查哈希代码,如果哈希代码相同,则使用Equals方法。这避免了不同对象出现相同哈希的可能性(这种可能性是大约四分之一,但它仍然会发生,第一人称看到)。在Equals()方法中,应该将一个对象与另一个对象的所有相关字段进行比较。在Equals中通过散列码比较对象是错误的,并且违背了该方法的全部目的。

希望能澄清。

为什么不自己测试?你已经有了代码。。。

MyComparer.GetHashCode将用于您的案例。您可以在此处查看代码:http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs#f4105a494115b366

如果您根本没有在Intersect调用中指定比较器,则会使用Custom.GetHashCode

通常,哈希码和getHashCode函数提供了一个很好的比较机制,但您应该注意相似性。由于哈希工具支持的范围有限,通常情况下,两个不同的数字会导致相同的哈希代码,这可能会干扰比较上下文。