C#哈希集是否通过Equals然后通过GetHashCode检查重复
本文关键字:检查 GetHashCode Equals 哈希集 是否 然后 | 更新日期: 2023-09-27 18:30:03
我只是想有人证实我的想法,我尝试了在Foo类中重写Equals和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();
}
- 当Equals为true时,Contains由GetHashCode确定
- 当Equals为false时,Contains始终为false
所以Contains是由Equals然后由GetHashCode确定的,对吗?
其他方式。调用第一个CCD_ 1。这是用来给出一个散列代码(因此得名),用于确定对象内部应该存储在哪里。
无法保证哈希码是唯一的(此外,它会进一步减少),因此可能有多个对象使用相同的哈希存储(越多,性能越差,但这是另一回事)。因此,在找到可能的匹配之后,使用CCD_ 2来确认匹配。
所以Contains
首先依赖于GetHashCode()
,然后依赖于Equals()
。
这两者协同工作,这就是为什么如果覆盖另一个,则必须始终覆盖其中一个,并且始终覆盖GetHashCode()
,以使任何两个将彼此视为Equal()
的对象都具有相同的代码。