当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-24

    本文导语:  向字典中添加键和值添加键和值使用 Add 方法,但很多时候,我们是不敢轻易添加的,因为 Dictionary 不允许重复,尝试添加重复的键时 Add 方法引发 ArgumentException。大多时候,我们都会写成以下的样子: 代码如下:var dict = new Dict...

向字典中添加键和值
添加键和值使用 Add 方法,但很多时候,我们是不敢轻易添加的,因为 Dictionary 不允许重复,尝试添加重复的键时 Add 方法引发 ArgumentException。
大多时候,我们都会写成以下的样子:

代码如下:

var dict = new Dictionary();
// ...
// 情形一:不存在才添加
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";

不过好多朋友都会对这种方式表示疑虑,不太确定这样会不会出问题。
不管是上面的哪种写法,用字典时最大的感觉就是担心,怕出异常,因此代码会写的很罗嗦。
我每次用字典时都这样,时间长了,实在是厌烦了,索性扩展一下,用以下两个方法来应对上面两种情形:
代码如下:

///
/// 尝试将键和值添加到字典中:如果不存在,才添加;存在,不添加也不抛导常
///
public static Dictionary TryAdd(this Dictionary dict, TKey key, TValue value)
{
    if (dict.ContainsKey(key) == false) dict.Add(key, value);
    return dict;
}
///
/// 将键和值添加或替换到字典中:如果不存在,则添加;存在,则替换
///
public static Dictionary AddOrReplace(this Dictionary 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 扩展:
代码如下:

///
/// 获取与指定的键相关联的值,如果没有则返回输入的默认值
///
public static TValue GetValue(this Dictionary 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 类有个 AddRange 方法,可以不用 foreach 循环直接向当前集合加入另外一个集合:
代码如下:

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

相当方便,可怜 Dictionary 类没有,幸好有扩展方法:
代码如下:

///
/// 向字典中批量添加键值对
///
/// 如果已存在,是否替换
public static Dictionary AddRange(this Dictionary dict, IEnumerable 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()
    .AddOrReplace(2, 2)
    .AddOrReplace(3, 3);
var dict2 = new Dictionary()
    .AddOrReplace(1, 1)
    .AddOrReplace(2, 1)
    .AddRange(dict1, false);

    
 
 

您可能感兴趣的文章:

  • Python 字典(Dictionary)操作详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.util类dictionary<k,v>的类成员方法: dictionary定义及介绍
  • c# Dictionary遍历方法的小例子
  • java命名空间java.util类dictionary<k,v>的类成员方法: isempty定义及介绍
  • C#的Dictionary几种遍历的代码
  • java命名空间java.util类dictionary<k,v>的类成员方法: keys定义及介绍
  • C# Dictionary的使用实例代码
  • java命名空间java.util类dictionary<k,v>的类成员方法: elements定义及介绍
  • ASP.NET Dictionary 的基本用法示例介绍
  • java命名空间java.util类dictionary<k,v>的类成员方法: get定义及介绍
  • C# Dictionary操作范例(入门新手参考)
  • java命名空间java.util类dictionary<k,v>的类成员方法: remove定义及介绍
  • C#中查找Dictionary中重复值的方法
  • java命名空间java.util类dictionary<k,v>的类成员方法: put定义及介绍
  • C# Hashtable/Dictionary写入和读取对比详解
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • Python中dictionary items()系列函数的用法实例
  • C#泛型Dictionary的用法实例详解


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3