51

可能重复:
为什么 IEnumerable 接口上没有 ForEach 扩展方法?

编辑

作为参考,这里是 eric 在评论中提到的博客文章

https://ericlippert.com/2009/05/18/foreach-vs-foreach/

原创

我想更多的是一种好奇心,但对于 C# Specification Savants 来说……

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

您必须首先将结果转换为 ToList() 或 ToArray() 大概 C# 迭代 IEnumerables Vs 的方式存在技术限制。列表...是否与 IEnumerables/IQerable 集合的延迟执行有关。例如

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

1 回答 1

15

完全可以ForEachIEnumerable<T>.

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

  • 也许是因为在 LINQ 之前和之前ForEach已经存在。List<T>Array
  • 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);
    }
}
于 2009-05-13T16:42:00.837 回答