当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C#HashSet是否通过Equals然后通过GetHashCode检查重复?》经验,为你挑选了1个好方法。

只是想让某人确认我的想法,我在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 set = new HashSet();
        Foo f1 = new Foo();
        Foo f2 = new Foo();

        Console.WriteLine(f1.Equals(f2));
        set.Add(f1);
        Console.WriteLine(set.Contains(f2));
        Console.ReadLine();
    }

    当Equals为true时,Contains由GetHashCode确定;

    当Equals为false时,Contains始终为false.

所以Contains由Equals决定,然后由GetHashCode决定,对吗?



1> Jon Hanna..:

其他方式.首先GetHashCode()叫.这用于给出哈希码(因此名称),用于确定对象应存储在何处.

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

所以首先Contains取决于GetHashCode(),然后取决于Equals().

两者协同工作是为什么你必须总是覆盖一个,如果你覆盖另一个,并总是覆盖你GetHashCode()的方式,任何两个相互考虑的对象Equal()将具有相同的代码.


@JoelCoehoorn那完全是假的.两个相等的对象必须具有相同的哈希码,但是两个不同的对象可以具有相同的哈希码
@JoelCoehoorn这几乎总是一个可怕的想法.
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有