在 .Net 标准库中是否有一个 .Each()(或 .ForEach())迭代器?
在 .Net 标准库中是否有一个 .Each()(或 .ForEach())迭代器?
可能是重复问题:
我想知道是否有一种类似于.Net库中的下面的.Each()方法的方法可以用于IEnumerable:
var intArray = new [] {1, 2, 3, 4}; intArrary.Each(Console.WriteLine);
我知道可以使用foreach
循环或者轻松编写一个类似下面的扩展方法:
public static class EnumerableExtensions { public static void Each(this IEnumerable enumberable, Action action) { foreach (var item in enumberable) { action(item); } } }
但是我希望不要创建自己的方法,以防止在库中已经存在这样的扩展方法时搞乱代码。像.Each()这样的方法(可以通过额外参数添加条件的几个重载)对程序员来说非常需要,应该已经有了。我对吗?
更新
Ruby开发人员可能会将其识别为.each()迭代器。这就是我希望在C#中拥有的东西。也许C#可以有更多像Ruby中的迭代器方法。
在.NET标准库中,是否有一个名为.ForEach()的迭代器?原因是有用户在提问中询问是否有类似的迭代器,并给出了一个示例代码。解决方法是使用List
在.NET标准库中,是否有一个.Each()(或.ForEach())迭代器?
在.NET标准库的IEnumerable
http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
在Array类中有一个静态的ForEach方法,而List
下面是PLINQ中的一个这样的方法:http://msdn.microsoft.com/en-us/library/dd383744.aspx
这是一个关于PLINQ的一般指南:http://msdn.microsoft.com/en-us/library/dd460688.aspx
如果需要,建议创建两个版本的方法,一个包含索引器,一个不包含。这样做非常有用,可以避免使用select语句来获取索引。
例如:
public static void ForEach(IEnumerable enumerable, Action action) { foreach(var item in enumerable) action(item); } public static void ForEach (IEnumerable enumerable, Action action) { int index = 0; foreach(var item in enumerable) action(item, index++); }
同时,建议在这些公共方法中进行参数验证。
你能否详细解释一下"性能"和"索引器"的含义?
应该是action(item)
吧?否则你是对整个可枚举对象执行action
。
是的,你说得对。我之前写得比较匆忙,我会相应地进行更新。
缺少第一个参数的this
。
在.NET标准库中是否有一个.Each()(或.ForEach())迭代器?
在.NET标准库中,System.Collections.List<T> 类有一个 ForEach 方法,但是 IEnumerable 接口并没有这个方法。需要注意的是,这个方法也不是 LINQ 的一部分(它在.NET 2.0 中就已经存在了)。
乍一看,你会期望这个方法是 LINQ 的一部分,因为它在某种程度上扩展了普通 List 的功能。然而,LINQ 更多的是关于数据分组、过滤和转换。如果你仔细观察,大多数(如果不是全部,我不是 Jon Skeet,我不是内行!)的 LINQ 方法都返回一种 IEnumerable。
然而,你可能想看看 MoreLinq。这是一个开源项目,它为现有的 LINQ to Objects 添加了一些关键功能之一,其中之一就是你想要的 ForEach 方法(在这种情况下可以在任何 IEnumerable 上工作,所以它也适用于数组)。
Rx 在 EnumerableEx 中为 IEnumerable 包含了 ForEach ... 它肯定会成为 BCL 的一部分,在将来的版本中作为扩展方法为 IEnumerable 添加许多其他运算符。
我刚刚再次检查了最新版本,发现它不是其中的一部分... 糟糕。:S 我猜他们把它移除了。不过,Run 和 Do 方法可以实现相同的功能,Run 返回 void,Do 返回未更改的输入 IEnumerable。