C#为什么 Dictionary 没有 AddRange 方法?
咨询区
Custodio:
我一直都有一个疑惑?那就是为啥 Dictionary 不提供 AddRange 方法呢?
回答区
Rafal Zajac:
我觉得 Dictionary 之所以没有提供 AddRange
方法,主要还是考虑当遇到重复key的时候该如何处理?比如下面四种情况:
忽略
A 和 B 重复,忽略 B 。
覆盖
A 和 B 重复,覆盖 A。
合并
A 和 B 重复,将 key 的 value 进行合并。
异常
A 和 B 重复,抛异常给用户处理。
当然这也不是多难得事情,我自己就封装一个 AddRange 的扩展方法,代码如下:
namespace MyProject.Helper
{public static class CollectionHelper{public static void AddRangeOverride<TKey, TValue>(this IDictionary<TKey, TValue> dic, IDictionary<TKey, TValue> dicToAdd){dicToAdd.ForEach(x => dic[x.Key] = x.Value);}public static void AddRangeNewOnly<TKey, TValue>(this IDictionary<TKey, TValue> dic, IDictionary<TKey, TValue> dicToAdd){dicToAdd.ForEach(x => { if (!dic.ContainsKey(x.Key)) dic.Add(x.Key, x.Value); });}public static void AddRange<TKey, TValue>(this IDictionary<TKey, TValue> dic, IDictionary<TKey, TValue> dicToAdd){dicToAdd.ForEach(x => dic.Add(x.Key, x.Value));}public static bool ContainsKeys<TKey, TValue>(this IDictionary<TKey, TValue> dic, IEnumerable<TKey> keys){bool result = false;keys.ForEachOrBreak((x) => { result = dic.ContainsKey(x); return result; });return result;}public static void ForEach<T>(this IEnumerable<T> source, Action<T> action){foreach (var item in source)action(item);}public static void ForEachOrBreak<T>(this IEnumerable<T> source, Func<T, bool> func){foreach (var item in source){bool result = func(item);if (result) break;}}}
}
然后像下面这样使用。
Dictionary<string, string> mainDic = new Dictionary<string, string>() { { "Key1", "Value1" },{ "Key2", "Value2.1" },
};
Dictionary<string, string> additionalDic= new Dictionary<string, string>() { { "Key2", "Value2.2" },{ "Key3", "Value3" },
};
mainDic.AddRangeOverride(additionalDic); // Overrides all existing keys
// or
mainDic.AddRangeNewOnly(additionalDic); // Adds new keys only
// or
mainDic.AddRange(additionalDic); // Throws an error if keys already exist
// or
if (!mainDic.ContainsKeys(additionalDic.Keys)) // Checks if keys don't exist
{mainDic.AddRange(additionalDic);
}
点评区
我个人觉得 Dictionary 中应该要提供一个 AddRange 方法,然后通过枚举的方式指定下遇到重复key的情况该执行什么路径,可能现有的扩展方法太多了,没有 AddRange 也可以轻松实现。
-----------------------------------
公众号【Csharp编程大全】,需要进技术群交流的,请添加小编mm1552923!
C#为什么 Dictionary 没有 AddRange 方法?相关推荐
- 为什么 Dictionary 没有 AddRange 方法?
咨询区 Custodio: 我一直都有一个疑惑?那就是为啥 Dictionary 不提供 AddRange 方法呢? 回答区 Rafal Zajac: 我觉得 Dictionary 之所以没有提供 A ...
- C#集合中的Add与AddRange方法
C#.NET的集合主要位于System.Collections和System.Collections.Generic(泛型)这两个namespace中. 1.System.Collections 比如 ...
- 关于HttpWebRequest AddRange 方法的参数
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 关于HttpWeb ...
- 【转载】C#中AddRange方法往ArrayList集合末尾添加另一个集合
ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,如果需要往一 ...
- 【转载】C#中List集合使用AddRange方法将一个集合加入到指定集合末尾
C#编程开发过程中,List集合是时常使用到的集合对象,如果在List集合的操作中需要将1个List集合加入到另一个List集合的末尾,则可以使用List集合的AddRange方法来实现,AddRan ...
- Dictionary的遍历方法
前两天遇到一个<int, List<int>>结构的字典,查了资料才知道怎么顺序遍历,现在简单的整理一下,以免以后忘记. public Dictionary<int, L ...
- ArrayList.AddRange 方法
原文:http://technet.microsoft.com/zh-cn/library/system.collections.arraylist.addrange(v=vs.90) ArrayLi ...
- 【C#学习笔记】 List.AddRange 方法
[官方笔记] 将指定集合的元素添加到 List 的末尾 命名空间:System.Collections.Generic 程序集:mscorlib(在 mscorlib.dll 中) public: v ...
- Python字典(Dictionary)的setdefault()方法的详解,字典中的赋值技巧
定义 1.字典的setdefault() 方法和 get()方法类似,返回指定键的值,如果键不在字典中,将会添加键值对,值默认为None. 2.setdefault()与get()区别: setdef ...
最新文章
- 深度学习在阿里B2B电商推荐系统中的实践
- 软件测试技术之功能测试六要素
- 一个资深技术人的转型之路
- Android输入输出机制之来龙去脉之前生后世
- 《系统集成项目管理工程师》必背100个知识点-62采购管理
- 一次旁站信息泄露的dedecms站点渗透
- java 二进制 归属权限_【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】...
- 前端学习(2307):react之props和state
- LeetCode——866.回文素数
- 基于插件架构的简单的Winform框架(下)
- 不是css3新增的技术,CSS3中的5个有趣的新技术
- 程序阅读理解题目(高中语文版,附答案)
- 在Word2019中不能插入公式的解决办法
- 详解RS485电路,就是那么简单!
- 卷积神经网络交通标志识别
- 一名淘宝店长运营店铺靠谱指南
- php页面强制横屏,Css实现手机端页面强制横屏(仅适用与一屏页面)
- Mac上使用微信读书(微信读书网页版)
- LayaAir引擎78款3D射击主题微信小游戏分享,看看玩过几款!
- 怎样在手机设置无线网络连接服务器,如何用手机设置wifi路由器?
热门文章
- 年轻人创新创业新理念
- mysql默认值_MySQL之默认值
- 深蓝词库转换 使用方法
- 源码时代教你免费下载被网站保护的图片,这招百试百灵!
- 《大学语文》练习题库
- 班级学籍管理系统c语言论文,c语言课程设计学生学籍管理系统论文.doc
- 试题 算法训练 观星 java 题解 624
- 单内存16g和双8g差别大吗_内存选单根16G还是两根8G?单/双通道内存对游戏帧数的影响实测...
- java中int[] arr和int arr[]有什么区别
- C语言之位段使用详解