为什么在添加到集合时不会为所有对象调用Equals()

Vik*_*ram 12 .net c# collections

我有一个类型,我在IDictionary中使用它作为键.类型如下

public  class Employee
{
    public string Name { get; set; }
    public int ID { get; set; }

    public override bool Equals(object obj)
    {
        Employee emp = obj as Employee;
        if (emp != null)
            return emp.Name.Equals(this.Name);
        return false;
    }

    public override int GetHashCode()
    {
        return this.Name.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我已经在我的主要内容中创建了一个字典,如下所示

 IDictionary<Employee, int> empCollection = new Dictionary<Employee, int>();
        Employee emp1 = new Employee() { Name = "abhi", ID = 1 };
        Employee emp2 = new Employee() { Name = "vikram", ID = 2 };
        Employee emp3 = new Employee() { Name = "vikram", ID = 3 };

        empCollection.Add(emp1, 1);
        empCollection.Add(emp2, 2);
        empCollection.Add(emp3, 3);
Run Code Online (Sandbox Code Playgroud)

现在在调试时我发现当emp1被添加到集合中时,只调用了GetHashCode方法的密钥类型,之后当emp2被添加到集合中时,只会再次调用GetHashCode方法,但是在emp3的情况下,GetHashCode和Equals方法都是叫做.

可能在问这个问题时看起来太天真但是为什么当eqImp2对象被添加到集合时不会调用Equals方法.里面发生了什么.请解释.

Jon*_*Jon 8

字典和所有其他类似容器使用哈希码作为快速和脏检查:不同的哈希码意味着两个对象绝对不相等; 相同的哈希码并不意味着什么.该文档GetHashCode通过说明来指定此行为

如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值.但是,如果两个对象的比较不相等,则两个对象的GetHashCode方法不必返回不同的值.

你的emp1emp2生成不同的哈希码,所以字典不需要运行Equals; 它已经知道它们并不平等.在另一方面,emp2并且emp3生成相同的哈希码,因此必须字典打电话Equals来肯定确定它们是否确实是平等的,或者如果相同的散列码是由偶然因素而造成的.