使用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
扩展方法。
我不确定为什么它不包含为内置的扩展方法:
ForEach
已经存在于List<T>
和Array
上。 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);
}
}
链接地址: http://www.djcxy.com/p/52959.html