使用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); } }