最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

復(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";

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

dict[3] = "Orange";

不過好多朋友都會對這種方式表示疑慮,不太確定這樣會不會出問題。
不管是上面的哪種寫法,用字典時最大的感覺就是擔(dān)心,怕出異常,因此代碼會寫的很羅嗦。
我每次用字典時都這樣,時間長了,實在是厭煩了,索性擴(kuò)展一下,用以下兩個方法來應(yīng)對上面兩種情形:
復(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 這兩個方法具有較強自我描述能力,用起來很省心,而且也簡單:
復(fù)制代碼 代碼如下:

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

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

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


再來看另外一個問題:

獲取值

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

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

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

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

/// <summary>
/// 獲取與指定的鍵相關(guān)聯(lián)的值,如果沒有則返回輸入的默認(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> 類有個 AddRange 方法,可以不用 foreach 循環(huán)直接向當(dāng)前集合加入另外一個集合:
復(fù)制代碼 代碼如下:

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

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

/// <summary>
/// 向字典中批量添加鍵值對
/// </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#實現(xiàn)應(yīng)用程序的監(jiān)控與調(diào)試的示例代碼

    C#實現(xiàn)應(yīng)用程序的監(jiān)控與調(diào)試的示例代碼

    日志記錄是軟件開發(fā)中不可或缺的功能,它能幫助開發(fā)者在應(yīng)用程序運行時記錄重要信息,本文就來介紹一下常用日志記錄功能以及常用的日志庫,感興趣的可以了解一下
    2024-03-03
  • C# 添加、修改以及刪除Excel迷你圖表的實現(xiàn)方法

    C# 添加、修改以及刪除Excel迷你圖表的實現(xiàn)方法

    下面小編就為大家分享一篇C# 添加、修改以及刪除Excel迷你圖表的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C#窗體讀取EXCEL并存入SQL數(shù)據(jù)庫的方法

    C#窗體讀取EXCEL并存入SQL數(shù)據(jù)庫的方法

    這篇文章主要介紹了C#窗體讀取EXCEL并存入SQL數(shù)據(jù)庫的方法,實例簡述了實現(xiàn)讀取excel及寫入SQL數(shù)據(jù)庫的原理與技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • c# 編寫的簡單飛行棋游戲

    c# 編寫的簡單飛行棋游戲

    這個簡單的飛行棋游戲主要是講的方法怎么應(yīng)用,充分的去理解方法和方法的調(diào)用。整體收獲還是很大的。感興趣的朋友可以參考下
    2021-06-06
  • C#使用IronPython調(diào)用python代碼的實現(xiàn)示例

    C#使用IronPython調(diào)用python代碼的實現(xiàn)示例

    本文主要介紹了在C#中使用IronPython調(diào)用Python代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • C#實現(xiàn)給DataGrid單元行添加雙擊事件的方法

    C#實現(xiàn)給DataGrid單元行添加雙擊事件的方法

    這篇文章主要介紹了C#實現(xiàn)給DataGrid單元行添加雙擊事件的方法,較為詳細(xì)的分析了C#給DataGrid單元添加雙擊事件的步驟及相關(guān)實現(xiàn)代碼,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • c# 反射用法及效率對比

    c# 反射用法及效率對比

    這篇文章主要介紹了c# 反射用法及效率對比,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C#操作串口通信協(xié)議Modbus的常用方法介紹

    C#操作串口通信協(xié)議Modbus的常用方法介紹

    這篇文章介紹了C#操作串口通信協(xié)議Modbus的常用方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C# Socket文件上傳至服務(wù)器的操作方法

    C# Socket文件上傳至服務(wù)器的操作方法

    文件上傳有FTP、WebApi、WebService等等,這次我們來實現(xiàn)一個基于socket通信的本地客戶端上傳文件到服務(wù)器的例子,這篇文章主要介紹了C# Socket文件上傳至服務(wù)器的操作方法,需要的朋友可以參考下
    2024-05-05
  • C#中將DataTable轉(zhuǎn)換成CSV文件的方法

    C#中將DataTable轉(zhuǎn)換成CSV文件的方法

    DataTable用于在.net項目中,用于緩存數(shù)據(jù),DataTable表示內(nèi)存中數(shù)據(jù)的一個表,在.net項目中運用C#將DataTable轉(zhuǎn)化為CSV文件,接下來通過本文給大家提供一個通用的方法,感興趣的朋友可以參考下
    2016-10-10

最新評論

东莞市| 南和县| 垦利县| 嘉鱼县| 汶上县| 托克逊县| 红原县| 枣庄市| 庆城县| 邵阳县| 苏尼特右旗| 新营市| 含山县| 嘉祥县| 伊吾县| 林周县| 房产| 云南省| 楚雄市| 康乐县| 扎鲁特旗| 边坝县| 通渭县| 宽城| 尼勒克县| 阿瓦提县| 台东县| 凤凰县| 昔阳县| 图木舒克市| 肇东市| 辰溪县| 北辰区| 宁明县| 且末县| 砀山县| 汕尾市| 三原县| 皮山县| 托克逊县| 徐水县|