46

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

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

var list = new List<string>();

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

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

4

3 回答 3

43

确实没了:

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


韦斯憔悴 | .NET 框架团队 (BCL) | http://blogs.msdn.com/b/bclteam/

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

于 2012-04-24T13:58:57.903 回答
19

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

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

另请参阅此答案以获取更多详细信息:

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

于 2012-04-24T14:04:16.673 回答
16

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

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

信用:LINQ 等效于 IEnumerable<T> 的 foreach

(注:不可重复)

于 2012-04-24T14:00:56.643 回答