当前位置: 移动技术网 > IT编程>开发语言>c# > Dictionary扩展基础类向字典中添加键和值

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

2019年07月18日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网