gpt4 book ai didi

.net - 为什么 Dictionary 没有 IEnumerable> ctor?

转载 作者:行者123 更新时间:2023-12-03 22:24:27 28 4
gpt4 key购买 nike

好的 - 所以我知道构建一个提供功能的工厂方法很简单;但鉴于 Dictionary<TKey, TValue>IEnumerable<KeyValuePair<TKey, TValue>> ,它不应该有一个等价于例如List<T> 的Ctor吗?的ctor(IEnumerable<T> range) ?

考虑到它提供了一个采用 IDictionary<TKey, TValue> 的 Ctor,这就更加愚蠢了。作为来源,但由于该接口(interface)也是IEnumerable<KeyValuePair<TKey, TValue>> ,IEnumerable 选项肯定会更有意义;除非 IEnumerable<>当类第一次设计时,界面并不存在。

更糟糕的是,如果您查看 ctor 的 IDictionary 版本的实现 - 输入字典是使用以下代码导入的:

foreach (KeyValuePair<TKey, TValue> pair in dictionary)
{
this.Add(pair.Key, pair.Value);
}

任何人都想出一个很好的理由来解释为什么框架设计者在只需要一个基本接口(interface)时选择了最具体的接口(interface)?

编辑

@Mark Seeman 建议避免重复键引发异常-这可能接近事实-但请考虑以下示例:
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void How_To_Break_The_IDictionary_Ctor_Design_Decision()
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("hello", "world");
dictionary.Add("Hello", "world");

Dictionary<string, string> dictionary2 =
new Dictionary<string, string>(dictionary,
StringComparer.CurrentCultureIgnoreCase);
}

我知道 - 测试是相反的 - 但出于某种原因,我认为它使我的观点更好:)

鉴于键比较器不是 IDictionary 接口(interface)的一部分,您永远不能保证您正在导入的字典不会生成重复键,因此 ArgumentException ,在构建新的。

尔格 - 你也可以有一个 IEnumerable 构造函数来做同样的事情。

最佳答案

非官方猜测 :

如果构造函数允许 IEnumerable<KeyValuePair<TKey, TValue>>您将能够使用相同的 key 提供多个项目,那么预期的行为是什么?

例如。你可以做这样的事情:

var kvps = new[]
{
new KeyValuePair<int, string>(1, "Foo"),
new KeyValuePair<int, string>(1, "Bar"),
new KeyValuePair<int, string>(1, "Baz")
}
var dic = new Dictionary<int, string>(kvps);

您可能会争辩说,这应该简单地抛出一个异常以与 Add 方法的行为保持一致,但我猜设计团队认为这将是一个比实际有用的更大的困惑来源......

关于.net - 为什么 Dictionary<TKey, TValue> 没有 IEnumerable<KeyValuePair<TKey, TValue>> ctor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2252823/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com