C# 是列表<;T>;。ForEach()方法消失了吗?

C# 是列表<;T>;。ForEach()方法消失了吗?,c#,.net,windows-8,windows-store-apps,C#,.net,Windows 8,Windows Store Apps,我最近开始涉足Windows8Metro,发现我的一个老朋友似乎失踪了 我倾向于使用.ForEach()方法,而不是使用传统的ForEach()构造,我很快意识到这种方法不可用。例如,此代码不会在metro应用程序下编译: var list = new List<string>(); list.ForEach(System.Diagnostics.Debug.WriteLine); var list=newlist(); list.ForEach(System.Diagnosti

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

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

var list = new List<string>();

list.ForEach(System.Diagnostics.Debug.WriteLine);
var list=newlist();
list.ForEach(System.Diagnostics.Debug.WriteLine);
我搜索了一下,想看看是否能找到关于这方面的讨论,但没有找到。我只是迟钝,还是它真的消失了?

List.ForEach已在Metro样式的应用程序中删除。虽然这个方法看起来很简单,但是当列表被传递给ForEach的方法改变时,它会有一些潜在的问题。相反,建议您只使用foreach循环


Wes Haggard |.NET框架团队(BCL)|


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

另一种选择是自己定义它,当然:

public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
    foreach(T item in enumeration)
    {
        action(item);
        yield return item;
    }
}
公共静态IEnumerable ForEach(此IEnumerable枚举,操作)
{
foreach(枚举中的T项)
{
行动(项目);
收益回报项目;
}
}
学分:


(注意:不是重复的)

要了解为什么它可能不再包括在内,请阅读Microsoft C#团队工作人员的这篇文章:


基本上,这是哲学。“LINQ”特性受到函数式编程范例的高度启发,而ForEach扩展正好相反。。。它鼓励糟糕的功能风格。

IEnumerable从来没有ForEach扩展方法,只有IList有它为什么这比
ForEach
块好?@Jodrell:它们在所有实际用途上都是一样的。这是个人喜好的问题;虽然对于一行程序来说,
List.ForEach
可能更容易阅读。@mellamokb但是,一行程序更容易阅读吗?我想这一点是没有意义的。好吧,标题仍然是不正确的(技术上),因为它不是一个扩展方法。这是
List
上的一个普通实例方法。乔尔:我过早地使用了泛型,将标题改为reflect List,而不是IEnumerable。啊,又是那个Lippert家伙。他到底知道什么@Robaticus:您可以添加自己的扩展方法来替换它。可能最好先调用
.ToList()
,然后进行迭代。没有什么比迭代一个源代码而试图对它进行变异来破坏你的一天更糟糕的了。@Will-我同意我能做到。不过,这可能是一个很好的习惯,尤其是在向新的LINQ程序员展示如何做事情时。虽然这绝对是可以接受的做法,但请注意,它不会修改以前IEnumerable调用(例如Where或OrderBy)的任何要求。此外,如果要继续链接IEnumerable调用,可以在对项目执行操作后将返回类型更改为
IEnumerable
yield return item
。但是,这仍然会改变元素,因此请注意这些“副作用”可能会改变枚举。是的,ForEach肯定是危险的。我已将答案更新为return
IEnumerable
,以允许继续链接,但这可能会使事情变得更加危险。