C#基础 Dictionary存储自定义对象作为键值

时间:2021-10-04 03:46:29

程序每次向容器Dictionary中插入数据时,都会判断Key值是否已经存在,如果不存在,则插入。否则抛出异常。那么Dictionary又是如何判断Key值是否存在的呢? 请看下面的代码:

 

class Program

    {

        static void Main(string[] args)

        {

            var dic = new Dictionary<Person, int>();

            dic.Add(new Person {Name = "ABC", Age = 18}, 1);

            dic.Add(new Person { Name = "Captain", Age = 24 }, 1);

            dic.Add(new Person { Name = "Knee", Age = 28 }, 1);

            dic.Add(new Person { Name = "Knee", Age = 28 }, 2);

 

            foreach (var item in dic)

            {

                Console.WriteLine(string.Format("{0},{1}", item.Key.Name, item.Key.Age));

            }

 

            Console.ReadKey();

        }

    }

 

    public class Person

    {

        public string Name { get; set; }

 

        public int Age { get; set; }

 

        public override bool Equals(object obj)

        {

            if (!(obj is Person))

            {

                return false;

            }

            var p = (Person) obj;

            Console.WriteLine(string.Format("Equals{0}", p.Name));

            return this.Name == p.Name && this.Age == p.Age;

        }

 

        public override int GetHashCode()

        {

            Console.WriteLine(string.Format("GetHashCode{0}", this.Name));

            return Name.GetHashCode() + Age*37;

        }

    }

 

C#基础 Dictionary存储自定义对象作为键值

 

 

从程序运行的结果可以看出,程序每次向Dictionary插入数据的时候,都会调用对象的GetHashCode方法,当得到的值在Dictionary中没有时,就会向Dictionary中插入数据。当第四条数据插入时,程序检测到Dictionary中已经存在了同样的Hash值,它会继续去比较对象的Equals方法,发现对象一致之后,程序抛出异常。

 

总结:Dictionary插入对象时,会先根据Key的GetHashCode方法来判断是否存在,如果已经存在该HashCode的数据,会继续比较对象的Equals方法,,如果Equals方法返回true,说明两个对象一致,不予以插入。反之,则可插。