【问题标题】:Why does the generic Dictionary in .NET not provide a ForEach() method?为什么 .NET 中的通用 Dictionary 不提供 ForEach() 方法?
【发布时间】:2018-02-24 01:42:16
【问题描述】:

经过几个小时的研究(在 MSDN 网站等上),我没能弄清楚为什么通用 Dictionary<TKey, TValue> 没有像 List<T> 那样提供 ForEach() 方法。有人可以给我一个解释吗? (我知道将它实现为扩展方法并不难,可以看到一个很好的例子here,我只是想知道是否可能有特殊原因导致 .NET 库一开始就没有提供它。 )

提前致谢。

【问题讨论】:

  • 答案就在你引用的问题中:字典每个键只有一个值,所以不需要foreach
  • 是的,但他可能想要遍历字典中的所有 KVP。
  • @Jeremy IDictionary<,> 没有实现 IEmumerable<KeyValuePair<,>> 吗?如果一个是不必要的,那么另一个肯定也是如此。 Java 的Map<,> 有一个forEachEntry 方法。也许这就是 OP 所询问的。
  • 同意,这就是我的意思——我希望像这样遍历条目:d.ForEach(p => { Console.WriteLine(p.Key + ' ' + p.Value); });
  • List.ForEach 有一个非常强大的隐含保证:元素的暴露顺序是高度确定的。添加或删除项目不会从根本上改变这一点。 Dictionary 不能提供任何此类保证,它不是有序集合。尤其糟糕,因为它很容易看起来有序,您确实倾向于按照添加的顺序取回项目。但是当它决定重新组织存储桶时,它可能会随机改变。

标签: c# dictionary generics foreach iteration


【解决方案1】:

因为 List<T> 首先拥有它是值得怀疑的。无需到处重复同样的错误。 Eric Lippert 在他的blog post 中给出了两个原因:

第一个原因是这样做违反了所有其他序列运算符所基于的函数式编程原则。显然,调用此方法的唯一目的是引起副作用。 (...)

第二个原因是这样做会给语言增加零新的表示能力。这样做可以让你重写这段非常清晰的代码:

foreach(Foo foo in foos){ 涉及 foo 的语句; }

进入这段代码:

foos.ForEach((Foo foo)=>{ 涉及 foo 的语句; });

它使用几乎完全相同的字符,但顺序略有不同。然而第二个版本更难理解、更难调试,并且引入了闭包语义,从而可能以微妙的方式改变对象的生命周期。 (...)

【讨论】:

    猜你喜欢
    • 2010-11-08
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2023-03-30
    • 2011-02-23
    • 2010-09-30
    相关资源
    最近更新 更多