c# 扩展方法奇思妙用基础:Dictionary<TKey, TValue> 扩展
2015-06-15 18:46
716 查看
Dictionary
其实,第二种情形可以写如下书写(请参见 http://msdn.microsoft.com/zh-cn/library/9tee9ht2.aspx):
不过好多朋友都会对这种方式表示疑虑,不太确定这样会不会出问题。
不管是上面的哪种写法,用字典时最大的感觉就是担心,怕出异常,因此代码会写的很罗嗦。
我每次用字典时都这样,时间长了,实在是厌烦了,索性扩展一下,用以下两个方法来应对上面两种情形:
TryAdd 和 AddOrReplace 这两个方法具有较强自我描述能力,用起来很省心,而且也简单:
或者像 Linq 或 jQuery 一样连起来写:
再来看另外一个问题:
获取值
从字典中获取值通常使用如下方式:
使用索引的方式获取前一定先判断,否则不存在时会引发 KeyNotFoundException 异常。
我尤其讨厌第二种方式,因为采用 out 要提前声明一个变量,代码至少要两行,不够简洁。
看下 GetValue 扩展:
使用方便:
一行代码能搞定。
批量添加
相当方便,可怜
使用示例:
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";
其实,第二种情形可以写如下书写(请参见 http://msdn.microsoft.com/zh-cn/library/9tee9ht2.aspx):
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);
相关文章推荐
- UI之各种控件的属性及使用方法说明(三)
- (iOS开发)IOS7 通过tag找不到UITableViewCell的子控件
- UIBarButtonItem-添加自定义Left或者Right按钮
- UIImage图片压缩和截取
- iOS——UILabel 详解
- serialVersionUID的作用
- UITextField UITextView回收键盘的方法
- requireJS使用教程
- iOS项目BuildVersion是什么
- webservice ssl 3 双向认证【openssl,jax-ws,soapui相关设置开发】
- 【uiautomator】Uiautomator API
- [转]KAGGLE ENSEMBLING GUIDE
- OPatch报错 Prerequisite check "CheckActiveFilesAndExecutables" failed
- 《UNIX环境高级编程》中apue.h的问题
- elasticsearch bulk报错EsRejectedExcutionException[rejected execution(queue capacity 50) on.......]
- 关于UITableView的一些用法
- linue查看当前所有文件夹空间大小
- 如何自定义一个UIView的绘制?
- android apk 防止反编译技术第四篇-对抗JD-GUI
- No suitable driver found for jdbc:mysql://localhost/shop