c# - 为什么 Dictionary 没有 AddRange?

标签 c# .net dictionary

标题已经足够基本了,为什么我不能:

Dictionary<string, string> dic = new Dictionary<string, string>();
dic.AddRange(MethodThatReturnAnotherDic());

最佳答案

对原始问题的评论很好地总结了这一点:

because no one ever designed, specified, implemented, tested, documented and shipped that feature. - @Gabe Moothart

至于为什么?好吧,可能是因为合并字典的行为无法以符合框架指南的方式进行推理。

AddRange不存在,因为范围对关联容器没有任何意义,因为数据范围允许重复条目。例如,如果你有一个 IEnumerable<KeyValuePair<K,T>>该集合不防止重复条目。

添加一组键值对,甚至合并两个字典的行为是直截了当的。然而,如何处理多个重复条目的行为却不是。

处理重复项时该方法的行为应该是什么?

我至少能想到三种解决方案:

  1. 为重复的第一个条目抛出异常
  2. 抛出包含所有重复条目的异常
  3. 忽略重复

当抛出异常时,原始字典应该是什么状态?

Add几乎总是作为一个原子操作来实现:它成功并更新集合的状态,或者它失败,并且集合的状态保持不变。作为AddRange可能因重复错误而失败,保持其行为与 Add 一致的方式也可以通过对任何副本抛出异常来使其成为原子,并保持原始字典的状态不变。

作为 API 使用者,必须迭代地删除重复元素会很乏味,这意味着 AddRange应该抛出一个包含所有重复值的异常。

然后选择归结为:

  1. 对所有重复项抛出异常,保留原始字典。
  2. 忽略重复项并继续。

有支持这两种用例的论据。为此,您是否添加 IgnoreDuplicates标志到签名?

IgnoreDuplicates标志(当设置为 true 时)也将提供显着的加速,因为底层实现将绕过重复检查代码。

现在,您有一个允许 AddRange 的标志支持这两种情况,但有一个未记录的副作用(这是框架设计者努力避免的事情)。

总结

由于在处理重复项时没有明确、一致和预期的行为,所以不一起处理它们更容易,并且不提供开始的方法。

如果您发现自己经常需要合并字典,您当然可以编写自己的扩展方法来合并字典,这将以适合您的应用程序的方式运行。

关于c# - 为什么 Dictionary 没有 AddRange?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6050633/

相关文章:

c# - 从 double 转换为 int 的最佳(最安全)方法

c# - List<T> Add 方法在 Button.Click 事件中不起作用,但在 Form.Load 中起作用

.net - 用于将属性序列化切换到 NetDataContractSerializer 的自定义属性

c# - 我如何知道执行应用程序的用户的配置文件是否是临时配置文件?

c# - 获取日期之间的整数

c# - 延迟加载和Thread.MemoryBarrier的使用

Asp.Net Webforms Vs Asp.Net WebSite(Razor) Vs Asp.Net MVC

python - 过滤Python字典的键以查找列表中的所有项目

java - 如何将 jdbcTemplate.queryForList 语句作为 List<Map<String, Object>> 传递给另一个方法

python - 使用正则表达式在 python 中的字符串中将 Boolean true 转换为 True