C#哈希集是否通过Equals然后通过GetHashCode检查重复

本文关键字:检查 GetHashCode Equals 哈希集 是否 然后 | 更新日期: 2023-09-27 18:30:03

我只是想有人证实我的想法,我尝试了在Foo类中重写EqualsGetHashCode的不同组合:

class Foo
{
    static int n;
    public override bool Equals(object obj)
    {
        return true;
        //return false;
    }
    public override int GetHashCode()
    {
        return 0;
        //return n++;
    }
}

测试结果显示:

    static void Main(string[] args)
    {
        HashSet<Foo> set = new HashSet<Foo>();
        Foo f1 = new Foo();
        Foo f2 = new Foo();
        Console.WriteLine(f1.Equals(f2));
        set.Add(f1);
        Console.WriteLine(set.Contains(f2));
        Console.ReadLine();
    }
  1. 当Equals为true时,Contains由GetHashCode确定
  2. 当Equals为false时,Contains始终为false

所以Contains是由Equals然后由GetHashCode确定的,对吗?

C#哈希集是否通过Equals然后通过GetHashCode检查重复

其他方式。调用第一个CCD_ 1。这是用来给出一个散列代码(因此得名),用于确定对象内部应该存储在哪里。

无法保证哈希码是唯一的(此外,它会进一步减少),因此可能有多个对象使用相同的哈希存储(越多,性能越差,但这是另一回事)。因此,在找到可能的匹配之后,使用CCD_ 2来确认匹配。

所以Contains首先依赖于GetHashCode(),然后依赖于Equals()

这两者协同工作,这就是为什么如果覆盖另一个,则必须始终覆盖其中一个,并且始终覆盖GetHashCode(),以使任何两个将彼此视为Equal()的对象都具有相同的代码。