1. 程式人生 > >C# Dictionary字典類介紹

C# Dictionary字典類介紹

前言

     最近在做專案的時候,用到了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要高