使用Foreach子句的Lambda表达式

可能重复:
为什么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 VS方式的技术限制。 列表...是否与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循环迭代序列很容易。
  • 也许是因为它没有被感觉到足够的功能/ 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);
        }
    }
    
    链接地址: http://www.djcxy.com/p/52959.html

    上一篇: Lambda Expression using Foreach Clause

    下一篇: Hidden Features of PHP?