关于c#:使用Foreach子句的Lambda表达式

Lambda Expression using Foreach Clause

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why is there not a ForEach extension method on the IEnumerable interface?

编辑

以下是埃里克在评论中提到的博客文章,供参考。

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

奥里格

我想这是个好奇心,但对于C规范专家来说……

为什么foreach()子句不能(或不可用)用于IQueryable/IEnumerable结果集…

您必须首先将结果转换为list()或toarray()。假设C迭代IEnumerables和List的方式存在技术限制…它与延迟执行的IEnumerables/iQuery集合有关吗?例如

1
2
3
4
5
6
7
8
9
10
11
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编写一个ForEach扩展方法。

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

  • 可能是因为LINQ之前ListArray上已经存在ForEach
  • 可能是因为使用ForEach循环迭代序列已经足够简单了。
  • 可能是因为感觉它不够实用。
  • 可能是因为它不可链接。(很容易制作一个可链接的版本,在执行一个操作后,yield是每个项目,但这种行为并不特别直观。)
1
2
3
4
5
6
7
8
9
10
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);
    }
}