C#HashSet是否通过Equals然后通过GetHashCode检查重复?

时间:2016-01-12 03:49:42

标签: c# .net dictionary hashset

只是想让某人确认我的想法,我在 Foo 类中尝试了覆盖等于 GetHashCode 的不同组合:

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。
  3. 所以包含由Equals决定,然后由GetHashCode决定,我是对的吗?

1 个答案:

答案 0 :(得分:7)

其他方式。首先调用GetHashCode()。这用于给出一个哈希码(因此得名),用于确定对象应该存储在何处。

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

因此,Contains首先取决于GetHashCode(),然后取决于Equals()

两者协同工作是为什么你必须总是覆盖一个,如果你覆盖另一个,并且总是覆盖你的GetHashCode(),以便任何两个彼此考虑的对象Equal()将有相同的代码。