C#字典Dictionary的用法(注重效能版)
阿新 • • 發佈:2018-12-26
內容會持續更新,有錯誤的地方歡迎指正,謝謝!
前言
以鍵值對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;
}