读书人

Listlt;Tgt;contains 步骤需重写equals ,H

发布时间: 2013-10-18 20:53:13 作者: rapoo

List<T>contains 方法需重写equals ,HashTable contains重写 GetHashCode原因
类结构:
public class Person
{
public String Name;
public int Id;
public Person()
{ }
public Person(String _name,int _id)
{
Name = _name;
Id = _id;
}
public override bool Equals(object obj)
{
if (obj == null)
return false;

if (this.GetType() != obj.GetType())
return false;

return Equals(obj as Person);
}

private bool Equals(Person p)
{
return (this.Id == p.Id) ;
}
public override int GetHashCode()
{
return this.Id;
}

}
调用:
Person p1 = new Person("a", 34);
Person p2 = new Person("b", 45);

List<Person> listP = new List<Person>();
listP.Add(p1);
if (!listP.Contains(p2))
{
listP.Add(p2);
}

Hashtable ht = new Hashtable();
ht.Add(p1.Id, p1);
if (!ht.Contains(p2))
{
ht.Add(p2.Id, p2);
}
单步调试会发现 listP.Contains(p2) 执行 Equals 方法,ht.Contains(p2)执行 GetHashCode 方法,为什么哦? c#?集合类
[解决办法]
用作 Hashtable 对象中键的对象还必须重写 GetHashCode 方法,因为这些对象必须生成其各自的哈希代码。
http://msdn.microsoft.com/zh-cn/library/system.object.gethashcode.aspx

我觉得你是要用Hashtable.ContainsValue 方法 吧

*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/
[解决办法]
与hash有关可能的会先调用GetHashCode,如果相等再调用Equals,比如HashSet<T>,Dictionary<K,V>。
对于引用类型而言,GetHashCode与Equals比较的都是它的地址,所以是一致的。
当你修改了Equals以后,对于hash应用来说可能出现GetHashCode不相等但是Equals相等的情况,显然违背了修改了Equals的初衷。所以要保证Equals相等的,GetHashCode也相等,才能保证hash应用的正确。
[解决办法]
C#高效编程这本书你最好买一本。
书上列出了50多个最佳实践。

关于GetHashCode,基本原则很简单:如果两个对象比较(重写Equals)相等,那么要保证GetHashCode相等,如果GetHashCode相等,对象可以不等。即,HashCode相等是对象相等的必要非充分条件。

如果你重写了Equals,必须重写GetHashCode,反之亦然,目的就是保持上面的原则成立。

读书人网 >C#

热点推荐