首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

List<T>contains 步骤需重写equals ,HashTable contains重写 GetHashCode原因

2013-10-18 
ListTcontains 方法需重写equals ,HashTable contains重写 GetHashCode原因类结构:public class Person{

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,反之亦然,目的就是保持上面的原则成立。

热点排行