使用Foreach子句的Lambdaexpression式

可能重复:
为什么IEnumerable接口上没有ForEach扩展方法?

编辑

作为参考,这里是eric在评论中提到的博客文章

http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

更多的好奇心,我想,但一个为C#规范Savants …

为什么ForEach()子句不能在IQueryable / IEnumerable结果集上使用(或不可用)…

你必须首先转换你的结果ToList()或ToArray()推测这是一个技术限制的方式C#迭代IEnumerables比。 列表…是否与IEnumerables / IQuerable集合的延期执行有关。 例如

var userAgentStrings = uasdc.UserAgentStrings .Where<UserAgentString>(p => p.DeviceID == 0 && !p.UserAgentString1.Contains("msie")); //WORKS userAgentStrings.ToList().ForEach(uas => ProcessUserAgentString(uas)); //WORKS Array.ForEach(userAgentStrings.ToArray(), uas => ProcessUserAgentString(uas)); //Doesn't WORK userAgentStrings.ForEach(uas => ProcessUserAgentString(uas)); 

多么惊人的巧合,我刚刚写了一篇关于这个问题的博客文章。 这 是5月18日出版 。 没有技术上的原因,为什么我们(或你!)不能做到这一点。 原因不在于哲学。 我的论点下周见我的博客。

IEnumerable<T>编写一个ForEach扩展方法是完全可能的。

我不太确定为什么它不作为一个内置的扩展方法:

  • 也许因为在LINQ之前ForEach已经存在于List<T>Array上。
  • 也许因为使用foreach循环迭代序列很容易。
  • 也许是因为它不被认为是function/ LINQy就够了。
  • 也许是因为它不可链接。 (做一个可链接的版本很容易,在执行一个动作后yield每个项目,但是这种行为并不是特别直观)。

 public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { if (source == null) throw new ArgumentNullException("source"); if (action == null) throw new ArgumentNullException("action"); foreach (T item in source) { action(item); } }