关于c#:.Net标准库中是否有.Each()(或.ForEach())迭代器?

is there a .Each() (or .ForEach() ) iterator in the .Net standard library?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
LINQ equivalent of foreach for IEnumerable

我想知道.NET库中是否有类似以下.each()的IEnumerable方法

1
2
var intArray = new [] {1, 2, 3, 4};
intArrary.Each(Console.WriteLine);

我知道我可以使用foreach循环,或者很容易地编写这样的扩展方法:

1
2
3
4
5
6
7
8
9
10
public static class EnumerableExtensions
{
    public static void Each<T>(this IEnumerable<T> enumberable, Action<T> action)
    {
        foreach (var item in enumberable)
        {
            action(item);
        }
    }
}

但是,如果库中已经有这样的扩展方法,我希望不要创建自己的方法来破坏代码。类似于.each()(带有一些可以将条件作为额外参数的重载)的东西是程序员非常需要的,而且应该已经有了一个。我说的对吗?

更新

Ruby开发人员可以将其识别为.each()迭代器。这就是我希望在C中得到的。也许C可以有更多类似于Ruby的迭代器方法。


正如其他人所说,IEnumerable上没有内置的。根据埃里克·利珀特的这篇文章,林肯团队反对:http://blogs.msdn.com/b/ericlippet/archive/2009/05/18/foreach-vs-foreach.aspx

Array.ForEach上有一个静态方法,List有一个实例方法。在plinq foreach类语句中也有类似的语句,但是要注意,它们是并行工作的,对于非常简单的操作可能导致非常糟糕的性能。在plinq中有一个这样的方法:http://msdn.microsoft.com/en-us/library/dd383744.aspx

下面是有关plinq的一般指南:http://msdn.microsoft.com/en-us/library/dd460688.aspx

如果你在parallelenumerable一节中随便翻一翻,我就找不到确切的文章,但它给出了关于如何提高代码中使用并行性的性能的警告和提示。

如果需要,我建议创建两个版本,一个包含索引器,另一个不包含索引器。这是非常有用的,可以保存一个select语句来获取索引。例如

1
2
3
4
5
6
7
8
9
10
public static void ForEach<T>(IEnumerable<T> enumerable,Action<T> action)
{
    foreach(var item in enumerable) action(item);
}

public static void ForEach<T>(IEnumerable<T> enumerable,Action<T,int> action)
{
    int index = 0;
    foreach(var item in enumerable) action(item,index++);
}

我还将包括参数验证,因为这些是公共方法。


是的。

1
someList.ForEach(x => Console.WriteLine(x));

或者使用数组:

1
Array.ForEach(someArray, x => Console.WriteLine(x));

注意,在上一个示例中,您必须对数组类调用静态方法

edit:命名空间为:System.Collections.Generic(对于列表方法)和System(对于数组方法)


System.Collections.List上有foreach方法,但IEnumerable上没有。注意,这也不是Linq的一部分(它已经存在于.NET 2.0中)。

乍一看,您会认为这是LINQ的一部分,因为它是普通列表功能的一种扩展。然而,LINQ更多的是分组、过滤和转换数据。如果你仔细看,大多数(如果不是所有的话,我不是Jon Skeet,我不知道这些东西的心脏!)LINQ方法返回某种可枚举的。

然而,你可能想看看莫里林。这是一个开源项目,它向现有的LINQ对象添加了一些关键特性,其中一个是您想要的FrACH方法(在这种情况下,在任何iQueDead上工作,因此它也将在您的数组上工作)。


不,很遗憾没有。(我想这个问题以前已经讨论过了,但现在找不到。)

由于历史上发生了一些奇怪的事故,ForEach方法最终以List而不是IEnumerable而告终,这样做更有意义,而且由于向后兼容,这是永远无法解决的。

自从扩展方法存在以来,一次又一次地请求添加一个ForEach(this IEnumerable, ...)扩展方法,但通常会被拒绝,因为这会导致混淆的行为:因为实例方法总是在扩展方法之前选择,这意味着除List和他们不允许在BCL中出现这种不一致。

因此,现在地球上几乎所有的.NET项目都是从上面描述的代码开始的:

1
2
3
4
5
6
7
8
9
10
namespace IEnumerableExtensions
{
    public static class IEnumerableExtensions
    {
        public static void ForEach<T>(this IEnumerable<T> xs, Action<T> f)
        {
            foreach (var x in xs) f(x);
        }
    }
}


它取决于框架版本

.NET 3.5和4.0具有ForEach方法


只有List提供了ForEach方法——对于所有其他类型,您必须滚动自己的扩展方法。