Dictionary扩展基础类向字典中添加键和值

   2015-10-13 0
核心提示:Dictionary<TKey, TValue> 类是常用的一个基础类,但用起来有时确不是很方便。本文逐一讨论,并使用扩展方法解决

向字典中添加键和值
添加键和值使用 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);

 
标签: Dictionary c#
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 的键">C#怎么使用struct类型作为泛型Dictionary
    本文小编为大家详细介绍“C#怎么使用struct类型作为泛型DictionaryTKey,TValue的键”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么使用struct类型作为泛型DictionaryTKey,TValue的键”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学
  • Swift 字典 Dictionary基本用法
    import UIKit    /*   字典的介绍   1.字典允许按照某个键访问元素   2.字典是由两部分组成, 一个键(key)集合, 一个是值(value)集合   3.键集合是不能有重复的元素, 值集合可以有重复的元素, 键和值是成对出现的   4.Swift 字典类型
    02-09
  • 在Objective-C 中使用字符生成NSArray、NSDicti
    @符号不仅可以生成字符串,还可以生成其他数据类型如NSArray、NSDictionary和NSNumber,是一种简洁快速的用法。// NSArrayarray = [NSArray arrayWithObjects:a, b, c, nil];array = @[ a, b, c ];// NSDictionarydict = [NSDictionary dictionaryWithObjects
    02-09
  • Objective-c - NSDictionary(NSMutableDictiona
    //NSDictionary 初始化NSDictionary *d1 = [NSDictionary dictionaryWithObjectsAndKeys:@"Shanghai", @"Location", @"Programmer", @"Occupation", nil];NSLog(@"d1: %@", d1);//NSDictionary 个数NSLog(@"d1 count: %ld
    02-09
  • VB中的Dictionary对象 vbs dictionary
     VB中的Dictionary对象     Dictionary对象不是VBA或Visual Basic实时语言的具体存在的部分,它是存在于Microsoft Scripting Runtime Library(SCRRUN.DLL)中的一个对象。    为了在应用程序中使用Dictionary对象,就必须利用Reference对话框增加一个
    02-09
  • [转] VB6.0 Dictionary 排序,生成Sign
      最近遇到好多要生成 sign 的接口,要求使用URL键值对的格式(即key1=value1key2=value2…)拼接成字符串,最后拼接上key进行MD5加密。  规则:.    ◆ 参数名ASCII码从小到大排序(字典序);.    ◆ 如果参数的值为空不参与签名;.    ◆ 参数
    02-09
  • C#字典 Dictionary 用法 cctv5体育节目表
    C#字典 Dictionary 用法 cctv5体育节目表
    Dictionary提供快速的基于键值的元素查找。结构是:Dictionary [key] , [value] ,当你有很多元素的时候可以用它。它包含在System.Collections.Generic名控件中。在使用前,你必须声明它的键类型和值类型。1 using System; 2 using System.Collections.Generic
    02-09
  • C#中Dictionary的作用及用法讲解 cpu是什么意思
    Dictionarystring, string是一个泛型他本身有集合的功能有时候可以把它看成数组他的结构是这样的:Dictionary[key], [value]他的特点是存入对象是需要与[key]值一一对应的存入该泛型通过某一个一定的[key]去找到对应的值举个例子:1 1//实例化对象 23 Diction
    02-08
  • [Swift]JSON字符串与字典(Dictionary)、数组(Ar
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen/LeetCode➤原
    02-07
  • iOS/Objective-C开发 字典NSDictionary的深复制(使用category)
    iOS/Objective-C开发 字典NSDictionary的深复制
    目标:把NSDictionary对象转换成NSMutableDictionary对象,对象内容是字符串数组,需要实现完全复制(深复制)。 如果调用NSDictionary的mutableCopy方法,可以得到一个NSMutableDictionary对象,但这只是浅复制,如果我们修改NSDictionary中数组内的值(当然
    02-07
点击排行