1. 程式人生 > >C#字典Dictionary的用法(注重效能版)

C#字典Dictionary的用法(注重效能版)

內容會持續更新,有錯誤的地方歡迎指正,謝謝!

前言

以鍵值對Dictionary<[key], [value]>形式存值,和雜湊表很像也是一種無序的結構。

要使用Dictionary,需要先匯入C#泛型名稱空間System.Collections.Generic

Dictionary需要注意的特性

1.任何鍵都必須是唯一的 ——> 不能新增相同key的鍵值對,不然就報錯:
這裡寫圖片描述
如果要修改已有key對應的value,可以這樣做:
這裡寫圖片描述

2.Unity5.4以下的版本,最好不要用foreach來遍歷字典:
法一:foreach遍歷字典,會生成GC:
這裡寫圖片描述
這裡寫圖片描述

法二:對於我這種需求,使用for迴圈,會生成更多的GC,因為存在mActMergeRedPointKey這個區域性List變數
這裡寫圖片描述


這裡寫圖片描述

法三:使用迭代器,不會生成GC:
這裡寫圖片描述
這裡寫圖片描述

3.根據key取value,最好使用 TryGetValue 而不是 ContainsKey+根據key索引value:
法一:ContainsKey+根據key索引value,不好,用了兩次查詢,第一次:ContainsKey,第二次:myDictionary[key]

if(myDictionary.ContainsKey(key))
{
    // 通過key索引value
    int resValue = myDictionary[key];
}

法二:TryGetValue的方法:

int resValue ;
myDictionary.TryGetValue(key, out
resValue);

使用TryGetValue更快,效能更好,因為只用了一次查詢,TryGetValue 比 ContainsKey後使用[key]取value,速度快一倍;
TryGetValue更安全,找不到value時返回false;而使用ContainsKey後使用[key]取value取不到時,會丟擲異常導致真機卡死。

用法

一般用法:key和value都為基本型別,舉例:key為int型別,value為string型別

// 宣告和初始化
Dictionary<int,string> myDictionary = new Dictionary<int
,string>(); // 新增元素 myDictionary.Add(key,value); // 判斷是否包含鍵 if(myDictionary.ContainsKey(key)) // 總個數 myDictionary.Count // 遍歷 foreach(string key in myDictionary.Keys) // myDictionary.Keys:所有鍵的集合 { int resValue = myDictionary[key]; } //呼叫成員Keys,會產生額外GC:Dictionary本身儲存資料是成對儲存的,也就是KeyValuePair,所以 //要單獨拿出Keys時會新建一個數組,這也使得GC增加,推薦大家如果不需要單獨儲存Keys,儘量避免呼叫。 // 移除指定鍵和值 myDictionary.Remove(key);

例項應用

    private Dictionary<uint, MyPet> myPets;
    public List<MyPet> GetShowPets()
    {
        List<MyPet> pets = new List<MyPet>();
        if (null != myPets)
        {
            var e = myPets.GetEnumerator();
            while (e.MoveNext())
            {
                if (CheckPetShow(e.Current.Key))
                {
                    pets.Add(e.Current.Value);
                }
            }
        }

        //根據配置表權重進行升序排序
        pets.Sort(
            delegate (MyPet pet1, MyPet pet2) 
            {
                return pet1.PetRankWeight.CompareTo(pet2.PetRankWeight);
            });

        return pets;
    }