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方法.里面发生了什么.请解释.
字典和所有其他类似容器使用哈希码作为快速和脏检查:不同的哈希码意味着两个对象绝对不相等; 相同的哈希码并不意味着什么.该文档GetHashCode通过说明来指定此行为
如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值.但是,如果两个对象的比较不相等,则两个对象的GetHashCode方法不必返回不同的值.
你的emp1并emp2生成不同的哈希码,所以字典不需要运行Equals; 它已经知道它们并不平等.在另一方面,emp2并且emp3生成相同的哈希码,因此必须字典打电话Equals来肯定确定它们是否确实是平等的,或者如果相同的散列码是由偶然因素而造成的.
| 归档时间: |
|
| 查看次数: |
793 次 |
| 最近记录: |