标题已经足够基本了,为什么我不能:
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>>
该集合不防止重复条目。
添加一组键值对,甚至合并两个字典的行为是直截了当的。然而,如何处理多个重复条目的行为却不是。
处理重复项时该方法的行为应该是什么?
我至少能想到三种解决方案:
- 为重复的第一个条目抛出异常
- 抛出包含所有重复条目的异常
- 忽略重复
当抛出异常时,原始字典应该是什么状态?
Add
几乎总是作为一个原子操作来实现:它成功并更新集合的状态,或者它失败,并且集合的状态保持不变。作为AddRange
可能因重复错误而失败,保持其行为与 Add
一致的方式也可以通过对任何副本抛出异常来使其成为原子,并保持原始字典的状态不变。
作为 API 使用者,必须迭代地删除重复元素会很乏味,这意味着 AddRange
应该抛出一个包含所有重复值的异常。
然后选择归结为:
- 对所有重复项抛出异常,保留原始字典。
- 忽略重复项并继续。
有支持这两种用例的论据。为此,您是否添加 IgnoreDuplicates
标志到签名?
IgnoreDuplicates
标志(当设置为 true 时)也将提供显着的加速,因为底层实现将绕过重复检查代码。
现在,您有一个允许 AddRange
的标志支持这两种情况,但有一个未记录的副作用(这是框架设计者努力避免的事情)。
总结
由于在处理重复项时没有明确、一致和预期的行为,所以不一起处理它们更容易,并且不提供开始的方法。
如果您发现自己经常需要合并字典,您当然可以编写自己的扩展方法来合并字典,这将以适合您的应用程序的方式运行。
关于c# - 为什么 Dictionary 没有 AddRange?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6050633/