亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

Dictionary擴展基礎類向字典中添加鍵和值

2020-01-24 03:04:33
字體:
來源:轉載
供稿:網友

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

復制代碼 代碼如下:

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

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

dict[3] = "Orange";

不過好多朋友都會對這種方式表示疑慮,不太確定這樣會不會出問題。
不管是上面的哪種寫法,用字典時最大的感覺就是擔心,怕出異常,因此代碼會寫的很羅嗦。
我每次用字典時都這樣,時間長了,實在是厭煩了,索性擴展一下,用以下兩個方法來應對上面兩種情形:
復制代碼 代碼如下:

/// <summary>
/// 嘗試將鍵和值添加到字典中:如果不存在,才添加;存在,不添加也不拋導常
/// </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 這兩個方法具有較強自我描述能力,用起來很省心,而且也簡單:
復制代碼 代碼如下:

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

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

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


再來看另外一個問題:

獲取值

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

復制代碼 代碼如下:

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

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

/// <summary>
/// 獲取與指定的鍵相關聯的值,如果沒有則返回輸入的默認值
/// </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;
}

使用方便:
復制代碼 代碼如下:

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

一行代碼能搞定。

批量添加

List<T> 類有個 AddRange 方法,可以不用 foreach 循環直接向當前集合加入另外一個集合:
復制代碼 代碼如下:

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

相當方便,可憐 Dictionary<TKey, TValue> 類沒有,幸好有擴展方法:
復制代碼 代碼如下:

/// <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;
}

使用示例:
復制代碼 代碼如下:

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);

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人在线国产精品| 国产精品自产拍在线观看| 欧美一区二区大胆人体摄影专业网站| 国产精品香蕉国产| 97视频在线观看免费高清完整版在线观看| 日韩中文字幕在线| 国产精品视频男人的天堂| 91大神福利视频在线| 色一区av在线| 久久中国妇女中文字幕| 91精品国产免费久久久久久| 欧美激情国内偷拍| 91精品国产高清自在线| 国产精品免费福利| 国产一区二区三区在线| 九九热这里只有精品6| 国产男女猛烈无遮挡91| 国产精品视频999| 欧美成人合集magnet| 国产在线视频2019最新视频| 国产精品一区久久| 成人欧美一区二区三区黑人孕妇| www.xxxx精品| 国产视频精品va久久久久久| 欧美日韩亚洲一区二| 国产精品女人网站| 精品成人av一区| 日本欧美在线视频| 性色av一区二区三区| 国产精品丝袜白浆摸在线| 色多多国产成人永久免费网站| 国产欧美亚洲视频| 欧美午夜xxx| 国产午夜精品免费一区二区三区| 国产91免费观看| 国内免费精品永久在线视频| 亚洲18私人小影院| 国产精品扒开腿做爽爽爽男男| 欧美亚洲成人网| 国产女同一区二区| 国产亚洲欧美日韩一区二区| 亚洲国产另类 国产精品国产免费| 国精产品一区一区三区有限在线| 精品国产一区二区三区久久狼5月| 色伦专区97中文字幕| 精品国产区一区二区三区在线观看| 国产日韩亚洲欧美| 韩国三级日本三级少妇99| 欧美极品第一页| 国产精品久久久久久久久久久不卡| 欧美精品videosex极品1| 亚洲电影免费观看高清完整版| 日韩中文字幕国产| 精品久久久久久电影| 欧美高清视频在线| 日韩网站免费观看高清| 国产成人极品视频| 91九色精品视频| 亚洲国产日韩欧美综合久久| 欧美精品www在线观看| 欧美视频免费在线| 久久五月情影视| xxxxx成人.com| 国产香蕉一区二区三区在线视频| 亚洲毛片在线免费观看| 91国内精品久久| 国产午夜精品一区二区三区| 色综久久综合桃花网| 欧美成人免费全部观看天天性色| 狠狠操狠狠色综合网| 久久精品电影网站| 欧美专区福利在线| 国产亚洲精品91在线| 国产日韩精品入口| 欧美高跟鞋交xxxxxhd| 日韩欧美aaa| 久久91亚洲精品中文字幕| 在线观看久久av| 久久人人爽人人爽爽久久| 日本欧美国产在线| 91在线国产电影| 国产69精品久久久| 国产欧美亚洲精品| 中文字幕亚洲色图| 国产精品极品美女在线观看免费| 久久人人看视频| 国产精品丝袜视频| 亚洲色图av在线| 国模视频一区二区三区| 国产精品色婷婷视频| 久久全球大尺度高清视频| 欧美日韩午夜激情| 尤物yw午夜国产精品视频明星| 亚洲丁香婷深爱综合| 精品久久久久久久中文字幕| 久久精品国产99国产精品澳门| 国产伦精品一区二区三区精品视频| 日韩大胆人体377p| 欧美激情一级精品国产| 成人精品视频在线| 久久久久久中文字幕| 一区二区三区动漫| 亚洲欧美日韩直播| 欧美亚洲第一区| 亚洲第一网站男人都懂| 亚洲美女在线观看| 国产男女猛烈无遮挡91| 亚洲成人激情在线观看| 97高清免费视频| 亚洲国产精品字幕| 亚洲毛茸茸少妇高潮呻吟| 国产欧美亚洲视频| 91精品国产自产在线老师啪| 久久久久久999| 欧美精品在线看| 国产精品激情av电影在线观看| 国产精品成人aaaaa网站| 亚洲四色影视在线观看| 欧美裸体xxxxx| 欧美日韩国产页| 成人春色激情网| 成人黄色片在线| 久久精品国产69国产精品亚洲| 国产精品美女在线观看| 日韩av网址在线观看| 欧美日韩中文字幕综合视频| 亚洲国产精品小视频| 岛国视频午夜一区免费在线观看| 九色精品免费永久在线| 欧美三级免费观看| 日本伊人精品一区二区三区介绍| 亚洲精品电影久久久| 国产亚洲精品久久久久久牛牛| 国产一区欧美二区三区| 深夜福利一区二区| 亚州欧美日韩中文视频| 欧美最顶级的aⅴ艳星| 亚洲伊人久久大香线蕉av| 青草成人免费视频| 97成人精品区在线播放| 欧美精品做受xxx性少妇| 国产成人涩涩涩视频在线观看| 国产日韩欧美影视| 国产精品亚洲视频在线观看| 亚洲福利在线观看| 亚洲乱码一区av黑人高潮| 日韩视频欧美视频| 最近2019年中文视频免费在线观看| 97在线视频免费播放| 国产亚洲精品日韩| 国产丝袜一区二区三区免费视频| 国产丝袜高跟一区| 亚洲综合第一页| 欧美一级片一区| 国产精品久久久久久久久久新婚| 日韩精品免费观看| 日韩中文字幕免费| 久久久久久久久久久人体| 国产成人精品久久二区二区| 亚洲国产高清自拍| 亚洲精品国产综合区久久久久久久| 亚洲午夜av久久乱码| 正在播放亚洲1区| 国产精品日韩在线一区|