A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘煜 中级黑马   /  2012-7-15 00:01  /  1320 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以下是我做练习时的一段代码,请问怎样让HashTable认为两个同值对象相等?希望高手能解决~~

using System;

namespace ConsoleApplication3
{
    class Age
    {
        private int _year;
        public Age(int year)
        {
            _year = year;
        }
        public int Year
        {
            get
            {
                return this._year;
            }
        }
        public override bool Equals(object obj)
        {
            Age a = (Age)obj;
            return a._year == this._year;
        }
        public override int GetHashCode()
        {
            return base.GetHashCode() ^ _year;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            System.Collections.Hashtable ageList = new System.Collections.Hashtable();
            Age a1 = new Age(123);//其中a1和a3拥有相同的值。
            ageList.Add(a1, a1);
            Age a2 = new Age(567);
            ageList.Add(a2,a2);

            Age a3 = new Age(123);

            Console.WriteLine(a1.Year);
            Console.WriteLine(a3.Year);

            bool boolean = a3.Equals(a1);
            Console.WriteLine(boolean);

            bool boolean2 = ageList.Contains(a3);
            Console.WriteLine(boolean2);//两个对象的Equals()方法返回为true,但是用到HashTable中就为False了


            Console.Read();

            /*
             * 运行结果:
             * 123
             * 123
             * True
             * False
             */
        }
    }
}

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
宋天琪 + 1
邓戊庚 + 1

查看全部评分

1 个回复

倒序浏览
1,由于没有重写 Age类的 GetHashCode() 方法;
2,两个Age对象的 GetHashCode() 返回值并不相同;
3,HashSet 会把它们当成2个对象处理,因此程序返回 false。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马