【问题标题】:Is there a way to use .ForEach on Dictionary contents?有没有办法在字典内容上使用 .ForEach ?
【发布时间】:2020-05-15 17:25:36
【问题描述】:

我将集合从 List 更改为 Dictionary,看来我需要将其从使用 .ForEach() 更改为 foreach() - 无论我是在迭代字典本身还是 Dictionary.Values

这没什么大不了的,但我已经看到了几次细微的差异,当您可以使用和不能使用 LINQ 时,我想知道是否有 一种方法,而我只是错过了它? p>

【问题讨论】:

  • 字典是可枚举的,所以你所要做的就是做 dict.Select() 或 dict.Where()
  • .ForEach 实际上是 method on List 而不是 IEnumerable 因此为什么它不适用于 Dictionary 而不是在 Linq 中。
  • 另请参阅此处的问题:stackoverflow.com/questions/101265/…
  • 是的,我想知道Values 是什么...我认为最终可能是List,但显然不是。我想知道是否有很好的技术原因或只是“因为”?
  • @Mr.Boy LINQ 是声明性方法,它不修改源集合,而是以 一种惰性方式 进行过滤/映射。 ForEach 与它有些相反...确实Select(x => action(x)).All() 大致相当于.ForEach 但这确实令人困惑,如果您需要非延迟执行,则常规foreach 会更加自我记录。

标签: c# .net


【解决方案1】:

很遗憾,.ForEach() 仅在 List<> 类上定义。

您可以先使用.ToList() 来访问.ForEach,但与仅使用foreach 相比,这当然会降低性能,或者您可以为此创建扩展方法:

public static void ForEach<T, U>(this Dictionary<T, U> d, Action<KeyValuePair<T, U>> a)
{
    foreach (KeyValuePair<T, U> p in d) { a(p); }
}

public static void ForEach<T, U>(this Dictionary<T, U>.KeyCollection k, Action<T> a)
{
    foreach (T t in k) { a(t); }
}

public static void ForEach<T, U>(this Dictionary<T, U>.ValueCollection v, Action<U> a)
{
    foreach (U u in v) { a(u); }
}

如果您有兴趣了解更多信息,SO 上已经有类似的article

【讨论】:

  • 我的意思是实际上它似乎不值得。我可以写一个循环,有时你只是觉得它们有点肮脏和过时;)
  • 我同意你说的。 :)
猜你喜欢
  • 2010-11-20
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2021-04-16
  • 1970-01-01
相关资源
最近更新 更多