咨询区

  • 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 方法?相关推荐

  1. 为什么 Dictionary 没有 AddRange 方法?

    咨询区 Custodio: 我一直都有一个疑惑?那就是为啥 Dictionary 不提供 AddRange 方法呢? 回答区 Rafal Zajac: 我觉得 Dictionary 之所以没有提供 A ...

  2. C#集合中的Add与AddRange方法

    C#.NET的集合主要位于System.Collections和System.Collections.Generic(泛型)这两个namespace中. 1.System.Collections 比如 ...

  3. 关于HttpWebRequest AddRange 方法的参数

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 关于HttpWeb ...

  4. 【转载】C#中AddRange方法往ArrayList集合末尾添加另一个集合

    ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,如果需要往一 ...

  5. 【转载】C#中List集合使用AddRange方法将一个集合加入到指定集合末尾

    C#编程开发过程中,List集合是时常使用到的集合对象,如果在List集合的操作中需要将1个List集合加入到另一个List集合的末尾,则可以使用List集合的AddRange方法来实现,AddRan ...

  6. Dictionary的遍历方法

    前两天遇到一个<int, List<int>>结构的字典,查了资料才知道怎么顺序遍历,现在简单的整理一下,以免以后忘记. public Dictionary<int, L ...

  7. ArrayList.AddRange 方法

    原文:http://technet.microsoft.com/zh-cn/library/system.collections.arraylist.addrange(v=vs.90) ArrayLi ...

  8. 【C#学习笔记】 List.AddRange 方法

    [官方笔记] 将指定集合的元素添加到 List 的末尾 命名空间:System.Collections.Generic 程序集:mscorlib(在 mscorlib.dll 中) public: v ...

  9. Python字典(Dictionary)的setdefault()方法的详解,字典中的赋值技巧

    定义 1.字典的setdefault() 方法和 get()方法类似,返回指定键的值,如果键不在字典中,将会添加键值对,值默认为None. 2.setdefault()与get()区别: setdef ...

最新文章

  1. 深度学习在阿里B2B电商推荐系统中的实践
  2. 软件测试技术之功能测试六要素
  3. 一个资深技术人的转型之路
  4. Android输入输出机制之来龙去脉之前生后世
  5. 《系统集成项目管理工程师》必背100个知识点-62采购管理
  6. 一次旁站信息泄露的dedecms站点渗透
  7. java 二进制 归属权限_【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】...
  8. 前端学习(2307):react之props和state
  9. LeetCode——866.回文素数
  10. 基于插件架构的简单的Winform框架(下)
  11. 不是css3新增的技术,CSS3中的5个有趣的新技术
  12. 程序阅读理解题目(高中语文版,附答案)
  13. 在Word2019中不能插入公式的解决办法
  14. 详解RS485电路,就是那么简单!
  15. 卷积神经网络交通标志识别
  16. 一名淘宝店长运营店铺靠谱指南
  17. php页面强制横屏,Css实现手机端页面强制横屏(仅适用与一屏页面)
  18. Mac上使用微信读书(微信读书网页版)
  19. LayaAir引擎78款3D射击主题微信小游戏分享,看看玩过几款!
  20. 怎样在手机设置无线网络连接服务器,如何用手机设置wifi路由器?

热门文章

  1. 年轻人创新创业新理念
  2. mysql默认值_MySQL之默认值
  3. 深蓝词库转换 使用方法
  4. 源码时代教你免费下载被网站保护的图片,这招百试百灵!
  5. 《大学语文》练习题库
  6. 班级学籍管理系统c语言论文,c语言课程设计学生学籍管理系统论文.doc
  7. 试题 算法训练 观星 java 题解 624
  8. 单内存16g和双8g差别大吗_内存选单根16G还是两根8G?单/双通道内存对游戏帧数的影响实测...
  9. java中int[] arr和int arr[]有什么区别
  10. C语言之位段使用详解