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日出版。我们(或你)没有技术上的原因不能这样做。为什么不这样做的原因是哲学上的。下周看我的博客,了解我的论点。
完全可以为
我不太确定为什么它不作为内置扩展方法包括在内:
- 可能是因为LINQ之前
List 和Array 上已经存在ForEach 。 - 可能是因为使用
ForEach 循环迭代序列已经足够简单了。 - 可能是因为感觉它不够实用。
- 可能是因为它不可链接。(很容易制作一个可链接的版本,在执行一个操作后,
yield 是每个项目,但这种行为并不特别直观。)
1 2 3 4 5 6 7 8 9 10 |