使用Foreach子句的Lambda表达式

时间:2009-05-13 16:30:19

标签: c# .net-3.5 lambda foreach

  

可能重复:
  Why is there not a ForEach extension method on the IEnumerable interface?

修改

供参考,这是eric在评论中引用的博客文章

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

ORIG

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

为什么ForEach()子句在IQueryable / IEnumerable结果集上不起作用(或不可用)...

您必须先转换结果ToList()或ToArray() 据推测,C#迭代IEnumerables Vs的方式存在技术限制。列表... 是否与IEnumerables / IQuerable Collections的延迟执行有关。 e.g。

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));

2 个答案:

答案 0 :(得分:58)

奇怪的是,我刚才写了一篇关于这个问题的博客文章。它 was published May 18th。没有技术原因我们(或你!)无法做到这一点。不是哲学的原因。下周请参阅我的博客,了解我的观点。

答案 1 :(得分:14)

完全可以为ForEach编写IEnumerable<T>扩展方法。

我不确定为什么它不作为内置扩展方法包含在内:

  • 可能因为ForEach已经存在于List<T>Array LINQ之前。
  • 也许是因为使用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);
    }
}