List <T> .ForEach()方法消失了吗?

Rob*_*cus 45 .net c# windows-8 windows-store-apps

我最近开始涉足Windows 8地铁,发现我的一个老朋友似乎已经失踪了.

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

var list = new List<string>();

list.ForEach(System.Diagnostics.Debug.WriteLine);
Run Code Online (Sandbox Code Playgroud)

我已经搜索过,看看我是否能找到任何关于此的讨论,但是无法进行.我只是在钝,还是它真的消失了?

Bol*_*ock 43

它确实消失了:

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


Wes Haggard | .NET Framework团队(BCL)| http://blogs.msdn.com/b/bclteam/

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


Joe*_*orn 18

要获得它为什么可能不再被包含在某种意义上说,看到这篇文章的人谁在微软的C#团队的工作原理:http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach -VS-foreach.aspx

基本上,它是哲学.在"LINQ"功能由函数式编程范式非常感动,给ForEach扩展中的面部苍蝇......鼓励穷人实用的风格.

  • 啊,这只是Lippert的家伙.他知道什么?;) (9认同)

yam*_*men 16

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

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

Credit:LINQ等效于IEnumerable <T>的foreach

(注意:不重复)

  • 虽然这绝对是可以接受的做法,但要小心它不会修改以前IEnumerable调用的任何要求(例如Where或OrderBy).此外,如果要继续链接IEnumerable调用,可以在对项目执行操作后将返回类型更改为"IEnumerable <T>"和"yield return item".但是,这仍然会改变元素,因此请注意这些"副作用"可能会改变枚举. (2认同)