C#基礎 Dictionary存儲自定義對象作為鍵值


程序每次向容器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;
        }
    }
 
 
 
從程序運行的結果可以看出,程序每次向Dictionary插入數據的時候,都會調用對象的GetHashCode方法,當得到的值在Dictionary中沒有時,就會向Dictionary中插入數據。當第四條數據插入時,程序檢測到Dictionary中已經存在了同樣的Hash值,它會繼續去比較對象的Equals方法,發現對象一致之后,程序拋出異常。
 
總結:Dictionary插入對象時,會先根據Key的GetHashCode方法來判斷是否存在,如果已經存在該HashCode的數據,會繼續比較對象的Equals方法,如果Equals方法返回true,說明兩個對象一致,不予以插入。反之,則可插。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM