【问题标题】:Is the List<T>.ForEach() method gone?List<T>.ForEach() 方法消失了吗?
【发布时间】:2012-04-24 13:57:12
【问题描述】:

我最近开始涉足 Windows 8 Metro,发现我的一个老朋友似乎失踪了。

比起使用传统的foreach() 构造,我更倾向于使用.ForEach() 方法,并且我很快意识到这种方法不可用。例如,此代码不会在 Metro 应用程序下编译:

var list = new List<string>();

list.ForEach(System.Diagnostics.Debug.WriteLine);

我已经搜索过是否可以找到任何关于此的讨论,但无法找到。我只是迟钝,还是真的消失了?

【问题讨论】:

  • IEnumerable 从来没有 ForEach 扩展方法,只有 IList 有它
  • 为什么这比 foreach 块更好?
  • @Jodrell:它们在所有实际用途中都是相同的。这是个人喜好问题;虽然List&lt;T&gt;.ForEach 对于单行文字来说可能更容易阅读。
  • @mellamokb 但是,单行代码更容易阅读吗?我想这点没有实际意义。
  • 好吧,标题仍然不正确(技术上),因为它不是扩展方法。是List&lt;T&gt;上的普通实例方法。

标签: c# .net windows-8 windows-store-apps


【解决方案1】:

It's indeed gone:

List.ForEach 已在 Metro 风格应用程序中删除。虽然该方法看起来很简单,但当列表被传递给 ForEach 的方法改变时,它有许多潜在的问题。相反,建议您简单地使用 foreach 循环。


韦斯·哈格德 | .NET 框架团队 (BCL) | http://blogs.msdn.com/b/bclteam/

然而,非常奇怪的是,它出现在 documentation 中,其中没有任何地方声明 .NET 不支持用于 Windows 应用商店应用程序的 .NET(以前用于 Metro 风格应用程序的 .NET)。也许这只是部分文档团队的疏忽。

【讨论】:

  • @Robaticus:您可以添加自己的扩展方法来替换它。可能最好先调用.ToList(),然后对其进行迭代。没有什么比在试图改变它来破坏你的一天的同时迭代一个源。
  • @Will - 我同意我可以做到。不过,摆脱它可能是一个好习惯,尤其是在向新的 LINQ 程序员展示如何做事时。
【解决方案2】:

要了解它可能不再包含在内的原因,请阅读 Microsoft C# 团队工作人员的这篇文章:http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

基本上,这是哲学。 “LINQ”特性受到函数式编程范式的高度启发,而 ForEach 扩展则与之背道而驰……它鼓励了糟糕的函数式风格。

有关详细信息,另请参阅此答案:

https://stackoverflow.com/a/529197/3043

【讨论】:

  • Joel:我过早地通用并更改了标题以反映 List,而不是 IEnumerable
  • 啊哈,又是那个利珀特人。他到底懂什么? ;)
【解决方案3】:

当然,另一种方法是自己定义:

public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
    foreach(T item in enumeration)
    {
        action(item);
        yield return item;
    }
}

信用:LINQ equivalent of foreach for IEnumerable<T>

(注意:不能重复)

【讨论】:

  • 虽然这绝对是可以接受的做法,但请注意它不会修改以前的 IEnumerable 调用(例如 Where 或 OrderBy)的任何要求。此外,如果要继续链接 IEnumerable 调用,可以在对项目执行操作后将返回类型更改为 IEnumerable&lt;T&gt;yield return item。但是,这仍然会改变元素,因此请注意这些“副作用”可能会改变枚举。
  • 是的,ForEach 确实很危险。我已将答案更新为返回 IEnumerable&lt;T&gt; 以允许继续链接,但这可能会使事情变得更加危险。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2021-12-04
  • 1970-01-01
  • 2011-10-03
  • 2016-02-22
  • 1970-01-01
相关资源
最近更新 更多