C# Dictionary字典類介紹
阿新 • • 發佈:2018-12-26
前言
最近在做專案的時候,用到了Dictinary<>,覺得很陌生,因為原來只有見過List類是帶尖括號的,也不知道為什麼要把實體放到Dictionary中,所以就查了一些資料,看了看API文件,發現原來他也是屬於泛型類的,下面就來聊一聊這個新朋友吧
概念
Dictionary 泛型類提供了從一組鍵到一組值的對映。字典中的每個新增項都由一個值及其相關聯的鍵組成。通過鍵來檢索值的速度是非常快的,接近於 O(1),這是因為 Dictionary 類是作為一個雜湊表來實現的。在C#中,Dictionary提供快速的基於鍵值的元素查詢。當你有很多元素的時候可以使用它。他需要引用的名稱空間是:System.Collection.Generic
結構
Dictionary<[key],[value]>
自己的理解:可以看出,他的儲存結構是通過雜湊表來實現的,一個鍵值,對應一個數據,通過鍵值就能快速的找出該鍵值對應的資料。當然鍵值是不能重複的。
和List<>效率對比
下邊是我寫的一個小demo,主要是測試遍歷list和dictionary的用時差別
新增用時:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; namespace dictionaryDemo { class Program { static void Main(string[] args) { Dictionary<int, string> dic = new Dictionary<int, string>(); for (int i = 0; i < 10000000; i++) { string a = "v" + i; dic.Add(i, a); } Stopwatch stopwatch1 = new Stopwatch(); stopwatch1.Start(); // 開始監視程式碼執行時間 foreach (KeyValuePair<int, string> item in dic) { if (item.Key==5000000) { Console.WriteLine(dic[5000000]); } } stopwatch1.Stop(); // 停止監視 List<string> studentinfo = new List<string>(); //studentModel student=new studentModel(); for (int i = 0; i < 10000000; i++) { string b = "b"+i; studentinfo.Add(b); } Stopwatch stopwatch2 = new Stopwatch(); stopwatch2.Start(); // 開始監視程式碼執行時間 foreach (string item in studentinfo) { if (item=="b5000000") { Console.WriteLine(studentinfo[5000000]); } } stopwatch2.Stop(); // 停止監視 Console.WriteLine("dictionary查詢用時{0}:",stopwatch1.Elapsed ); Console.WriteLine(" list查詢用時{0}:",stopwatch2.Elapsed); Console.ReadLine(); } } }
遍歷用時:
遍歷查詢用時:
直接查詢用時:
總結
實驗了才知道,其實不是任何時候dictionary都是最快的,我們知道list是以線性表的形式儲存的,通過前驅結點和後續節點,找到這個位置,在記憶體中是連續的區域,而dictionary在記憶體中是不連續的,所以在查詢的時候會產生大量的記憶體換頁操作,而list需要進行最少的記憶體換頁即可,所以直接查詢的時候,list效率明顯比dictionary要高