C# .Net 中字典Dictionary 泛型類 學習淺談


一、綜述:

Dictionary<TKey,TValue>是在 .NET Framework 2.0 版中是新增的。表示鍵值對的集合,Dictionary<TKey,TValue>類是作為一個哈希表來實現的,通過鍵來檢索值的速度非常快(檢索速度取決於為 TKey 指定的類型的哈希算法的質量),接近於 O(1),效率比List<T>高很多。

二、常用方法:

示例:

var  dict = new Dictionary<int, string>();
for (var i = 3; i < 10; i++)
{
       dict[i] ="a"+i.ToString();
}

1. 獲取值(TValue)

a. 利用鍵索引,字典中不存在該鍵時會拋出異常。

var rt1= dict[3];

b. TryGetValue(Tkey,out TValue) 推薦使用,第一個參數是鍵,第二個是獲取相關聯的值。如果未找到鍵,獲取適當的默認值;例如,為 int 類型為 0,bool為 false,引用類型為null,例如string。該方法返回類型為bool類型,找到並成功獲取到值返回true,否則返回false。

string rt2;
var rtBool = dict.TryGetValue(3, out rt2);

2. 獲取其中的項(鍵值對)KeyValuePair<TKey, TValue>

a.  First(),屬於擴展方法。 返回字典中的第一個匹配項,返回的結果是一個鍵值對。當沒有找到匹配項的時候引發異常

var r3 = dict.First(j => j.Key == 3);

b.  FirstOrDefault(),屬於擴展方法。返回字典中的第一個匹配項,結果也是一個鍵值對,沒有找到匹配項時不引發異常,且返回一個默認的鍵值對。例如,TValue為 int 類型為 0,bool為 false,引用類型為null。這個與常規的返回值不一樣,需要特別注意。

var r4 = dict.FirstOrDefault(j => j.Key == 12);

沒有找到的返回結果

3. ContainsKey(TKey) 確定 Dictionary<TKey, TValue> 是否包含指定的鍵(TKey)。返回值類型為bool

var r5 = dict.ContainsKey(1);

4. ContainsValue(TValue) 確定 Dictionary<TKey, TValue> 是否包含特定值(TValue)。返回值類型為bool

var r6 = dict.ContainsValue("a1");

5. 新添加值 Add(TKey,TValue) ,沒有返回值,如果插入失敗(例如插入重復鍵)將引發異常。

dict.Add(11, "a11");

需要注意的是利用dict[TKey]=TValue同樣可以實現插入,但同時也是編輯。它等同於

if (dict.ContainsKey(11))
{
     dict[11] = "a11";//修改更新
}
else
{
     dict.Add(11,"a11");//插入添加
}

6. 刪除 Remove(TKey),返回值為bool型。如果成功找到並移除該元素,則為 true;否則為 false。如果是循環查找刪除,不可以使用foreach,應當使用for。否則可能會引發異常。

    var keyArray = dict.Keys.ToArray();
    for (var i = 0; i < keyArray.Length; i++)
    {
        if (dict[keyArray[i]].Contains("a"))
        {
            var r7 = dict.Remove(keyArray[i]);
        }
    }

7. 清空字典 Clear() ,沒有參數,也沒有返回值。該方法會把集合中的元素對其他對象的引用也被釋放。 容量保持不變。此方法的運算復雜度為 O(n),其中 n 是字典的容量。

dict.Clear()

 

三、注:

1. Dictionary<TKey,TValue>中的任何鍵都必須是唯一的。

2. 鍵不能為空引用,但是如果值類型 TValue 為引用類型,該值則可以為空。

3. foreach 語句是對枚舉數的包裝,只允許該枚舉數讀取集合,而不允許對Dictionary<TKey,TValue>寫入、刪除。

4. 只要不修改該集合,Dictionary<TKey, TValue> 就可以同時支持多個閱讀器。 即便如此,從頭到尾對一個集合進行枚舉本質上並不是一個線程安全的過程。 當出現枚舉與寫訪問互相爭用這種極少發生的情況時,必須在整個枚舉過程中鎖定集合。 若要允許多個線程訪問集合以進行讀寫操作,則必須實現自己的同步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM