欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Dictionary擴(kuò)展基礎(chǔ)類向字典中添加鍵和值

 更新時(shí)間:2013年11月20日 14:40:35   作者:  
Dictionary<TKey, TValue> 類是常用的一個(gè)基礎(chǔ)類,但用起來(lái)有時(shí)確不是很方便。本文逐一討論,并使用擴(kuò)展方法解決

向字典中添加鍵和值
添加鍵和值使用 Add 方法,但很多時(shí)候,我們是不敢輕易添加的,因?yàn)?Dictionary<TKey, TValue> 不允許重復(fù),嘗試添加重復(fù)的鍵時(shí) Add 方法引發(fā) ArgumentException。
大多時(shí)候,我們都會(huì)寫成以下的樣子:

復(fù)制代碼 代碼如下:

var dict = new Dictionary<int, string>();
// ...
// 情形一:不存在才添加
if (dict.ContainsKey(2) == false) dict.Add(2, "Banana");
// 情形二:不存在添加,存在則替換
if (dict.ContainsKey(3) == false) dict.Add(3, "Orange");
else dict[3] = "Orange";

其實(shí),第二種情形可以寫如下書寫
復(fù)制代碼 代碼如下:

dict[3] = "Orange";

不過(guò)好多朋友都會(huì)對(duì)這種方式表示疑慮,不太確定這樣會(huì)不會(huì)出問(wèn)題。
不管是上面的哪種寫法,用字典時(shí)最大的感覺(jué)就是擔(dān)心,怕出異常,因此代碼會(huì)寫的很羅嗦。
我每次用字典時(shí)都這樣,時(shí)間長(zhǎng)了,實(shí)在是厭煩了,索性擴(kuò)展一下,用以下兩個(gè)方法來(lái)應(yīng)對(duì)上面兩種情形:
復(fù)制代碼 代碼如下:

/// <summary>
/// 嘗試將鍵和值添加到字典中:如果不存在,才添加;存在,不添加也不拋導(dǎo)常
/// </summary>
public static Dictionary<TKey, TValue> TryAdd<TKey, TValue>(this Dictionary<TKey, TValue> dict, TKey key, TValue value)
{
    if (dict.ContainsKey(key) == false) dict.Add(key, value);
    return dict;
}
/// <summary>
/// 將鍵和值添加或替換到字典中:如果不存在,則添加;存在,則替換
/// </summary>
public static Dictionary<TKey, TValue> AddOrReplace<TKey, TValue>(this Dictionary<TKey, TValue> dict, TKey key, TValue value)
{
    dict[key] = value;
    return dict;
}

TryAdd 和 AddOrReplace 這兩個(gè)方法具有較強(qiáng)自我描述能力,用起來(lái)很省心,而且也簡(jiǎn)單:
復(fù)制代碼 代碼如下:

dict.TryAdd(2, "Banana");
dict.AddOrReplace(3, "Orange");

或者像 Linq 或 jQuery 一樣連起來(lái)寫:
復(fù)制代碼 代碼如下:

dict.TryAdd(1, "A")
    .TryAdd(2, "B")
    .AddOrReplace(3, "C")
    .AddOrReplace(4, "D")
    .TryAdd(5, "E");


再來(lái)看另外一個(gè)問(wèn)題:

獲取值

從字典中獲取值通常使用如下方式

復(fù)制代碼 代碼如下:

string v = "defaultValue";
// 方式一
if (dict.ContainsKey(3)) v = dict[3];
// 方式二
bool isSuccess = dict.TryGetValue(3, out v);

使用索引的方式獲取前一定先判斷,否則不存在時(shí)會(huì)引發(fā) KeyNotFoundException 異常。
我尤其討厭第二種方式,因?yàn)椴捎?out 要提前聲明一個(gè)變量,代碼至少要兩行,不夠簡(jiǎn)潔。
看下 GetValue 擴(kuò)展:
復(fù)制代碼 代碼如下:

/// <summary>
/// 獲取與指定的鍵相關(guān)聯(lián)的值,如果沒(méi)有則返回輸入的默認(rèn)值
/// </summary>
public static TValue GetValue<TKey, TValue>(this Dictionary<TKey, TValue> dict, TKey key, TValue defaultValue = default(TValue))
{
    return dict.ContainsKey(key) ? dict[key] : defaultValue;
}

使用方便:
復(fù)制代碼 代碼如下:

var v1 = dict.GetValue(2);         //不存在則返回 null
var v2 = dict.GetValue(2, "abc");  //不存在返回 ”abc“

一行代碼能搞定。

批量添加

List<T> 類有個(gè) AddRange 方法,可以不用 foreach 循環(huán)直接向當(dāng)前集合加入另外一個(gè)集合:
復(fù)制代碼 代碼如下:

List<string> roles = new List<string>();
roles.AddRange(new[] { "role2", "role2" });
roles.AddRange(user.GetRoles());

相當(dāng)方便,可憐 Dictionary<TKey, TValue> 類沒(méi)有,幸好有擴(kuò)展方法:
復(fù)制代碼 代碼如下:

/// <summary>
/// 向字典中批量添加鍵值對(duì)
/// </summary>
/// <param name="replaceExisted">如果已存在,是否替換</param>
public static Dictionary<TKey, TValue> AddRange<TKey, TValue>(this Dictionary<TKey, TValue> dict, IEnumerable<KeyValuePair<TKey, TValue>> values, bool replaceExisted)
{
    foreach (var item in values)
    {
        if (dict.ContainsKey(item.Key) == false || replaceExisted)
            dict[item.Key] = item.Value;
    }
    return dict;
}

使用示例:
復(fù)制代碼 代碼如下:

var dict1 = new Dictionary<int, int>()
    .AddOrReplace(2, 2)
    .AddOrReplace(3, 3);
var dict2 = new Dictionary<int, int>()
    .AddOrReplace(1, 1)
    .AddOrReplace(2, 1)
    .AddRange(dict1, false);

相關(guān)文章

  • C#使?XmlReader和XmlWriter操作XML?件

    C#使?XmlReader和XmlWriter操作XML?件

    這篇文章介紹了C#使?XmlReader和XmlWriter操作XML?件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#窗體布局方式詳解

    C#窗體布局方式詳解

    這篇文章主要介紹了C#窗體布局方式詳解的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • C#實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音功能

    C#實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音功能

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C#判斷數(shù)據(jù)類型的簡(jiǎn)單示例代碼

    C#判斷數(shù)據(jù)類型的簡(jiǎn)單示例代碼

    本篇文章要是對(duì)C#中判斷數(shù)據(jù)類型的簡(jiǎn)單示例代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-01-01
  • C#實(shí)現(xiàn)上傳下載圖片

    C#實(shí)現(xiàn)上傳下載圖片

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)上傳下載圖片功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • c#操作json示例分享

    c#操作json示例分享

    這篇文章主要介紹了c#操作json示例,需要的朋友可以參考下
    2014-03-03
  • C#調(diào)用python文件執(zhí)行

    C#調(diào)用python文件執(zhí)行

    這篇文章主要為大家詳細(xì)介紹了C#調(diào)用python文件執(zhí)行的相關(guān)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • C#基于時(shí)間輪調(diào)度實(shí)現(xiàn)延遲任務(wù)詳解

    C#基于時(shí)間輪調(diào)度實(shí)現(xiàn)延遲任務(wù)詳解

    在很多.net開(kāi)發(fā)體系中開(kāi)發(fā)者在面對(duì)調(diào)度作業(yè)需求的時(shí)候一般會(huì)選擇三方開(kāi)源成熟的作業(yè)調(diào)度框架來(lái)滿足業(yè)務(wù)需求,但是有些時(shí)候可能我們只是需要一個(gè)簡(jiǎn)易的延遲任務(wù)。本文主要分享一個(gè)簡(jiǎn)易的基于時(shí)間輪調(diào)度的延遲任務(wù)實(shí)現(xiàn),需要的可以參考一下
    2022-12-12
  • c#中task與thread的區(qū)別及使用講解

    c#中task與thread的區(qū)別及使用講解

    這篇文章主要介紹了c#中task與thread的區(qū)別及使用講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • C#不可變類型深入解析

    C#不可變類型深入解析

    這篇文章主要介紹了C#不可變類型,對(duì)于C#程序員深入理解string數(shù)據(jù)類型有很大的幫助,需要的朋友可以參考下
    2014-08-08

最新評(píng)論