認識Dictionary<TKey,TValue>

首先,我們來看一個例子,簡單了解Dictionary的使用時機。

當某集合內的值順序是打亂的,則使用Array或List來讀取值的效能都不高!
為什麼?讓我們繼續看下去~


以此例,我想知道學號500210003學生的姓名與性別,但很不巧,
學生的學號並沒有依照順序排列,因此必須使用迴圈一一判斷哪個學生物件的ID=500210003

  static void Main(string[] args)
        {           
            Student[] stuArr = new Student[5]
            {
              new Student(500210001, "Lucy", 'F') ,
              new Student(500210005, "Yuta", 'M') ,
              new Student(500210002, "Pei", 'F') ,
              new Student(500210003, "Tim", 'M') ,
              new Student(500210004, "Jack", 'M')
            };
      
            for (int i = 0; i < stuArr.Length; i++)
            {
                if (stuArr[i].ID.Equals(500210003))
                {
                    Console.WriteLine($"學號500210003的學生姓名為{stuArr[i].Name},性別為{stuArr[i].Sexual}");
                   break;
                }
            }
         }

在同專案下自定義類別Student

  class Student
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public char Sexual { get; set; }
        public Student(int id, string name, char sex)
        {
            this.ID = id;
            this.Name = name;
            this.Sexual = sex;
        }
    }

輸出結果:
學號500210003的學生姓名為Tim,性別為M


但是在C#中有另一個物件容器Dictionary,它就可以使用對應的Key與Value,在不使用迴圈的狀況下就找到值。

接下來,來看看以此例Dictionary是如何一次命中結果的吧!

static void Main(string[] args)
        {
           //先將5個學生物件新增至stuDic容器裡
            Dictionary<int, Student> stuDic = new Dictionary<int, Student>()
            {
                { 500210001, new Student("Lucy", 'F') },
                { 500210005, new Student("Yuta", 'M') },
                { 500210002, new Student("Pei", 'F') },
                { 500210003, new Student("Tim", 'M') },
                { 500210004, new Student("Jack", 'M') }
            };

           //將Key當作index放入stuDic[],傳回的Value賦值給result
            Student result = stuDic[500210003];//比對Key後,傳回Value
            Console.WriteLine(result.Name);
            Console.WriteLine(result.Sexual);
        }

在同專案下自定義類別Student

 class Student
    {        
        public string Name { get; set; }
        public char Sexual { get; set; }
        public Student( string name, char sex)
        {           
            this.Name = name;
            this.Sexual = sex;
        }
    }

輸出結果:
Tim
M

現在,我們都知道使用Dictionary好處了:
只要我們查字典的時候,提供與值(Value)相對應關鍵字(Key)給字典,就能在最短的時間內得到結果!

在為Dictionary容器新增Key, Value時,有幾點要注意:

  1. Key不能重複
    練習時剛好出錯,Key重複,會輸出結果:
    System.ArgumentException: 已經加入含有相同索引鍵的項目。
  2. 不同的Key,Value可以重複
  3. Key與Value的資料型別可以不同

結論:
簡單來說,若我們得到的資訊有A搭配B的感覺,或是A對應到B的感覺,我們就可以使用Dictionary來查資料,
我現在就能想像到:眼前有一個龐大資料量的資料庫 - 關於產品info,假設我可以以Product item為關鍵字,去查詢價格、尺寸、數量、製造商等等。

對於這個新知識還不那麼熟悉,打鐵趁熱,下篇將以WindowsFormsApp來好好為大家示範如何使用Dictionary。

那麼,下篇見!

如有敘述錯誤,還請不吝嗇留言指教,thanks!