可能重复:
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));
答案 0 :(得分:58)
奇怪的是,我刚才写了一篇关于这个问题的博客文章。它将 was published May 18th。没有技术原因我们(或你!)无法做到这一点。不是哲学的原因。下周请参阅我的博客,了解我的观点。
答案 1 :(得分:14)
完全可以为ForEach
编写IEnumerable<T>
扩展方法。
我不确定为什么它不作为内置扩展方法包含在内:
ForEach
已经存在于List<T>
和Array
LINQ之前。foreach
循环来迭代序列很容易。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);
}
}