为何IEnumerable上没有ForEach扩展方法?

受到另外一个询问缺乏Zip功能的问题的启发: 框架

为何Enumerable类中没有ForEach扩展方法? 仍是在任 获取ForEach方法的惟一类是List<> 。 有没有理由错过(表演)? this


#1楼

大多数LINQ扩展方法都返回结果。 ForEach不适合这种模式,由于它什么都不返回。 spa


#2楼

在LINQ以前添加了ForEach方法。 若是添加ForEach扩展,因为扩展方法约束,它将永远不会为List实例调用。 我认为没有添加它的缘由是不干扰现有的。 code

可是,若是你真的错过这个小功能,你能够推出本身的版本 ip

public static void ForEach<T>(
    this IEnumerable<T> source,
    Action<T> action)
{
    foreach (T element in source) 
        action(element);
}

#3楼

我一直想知道本身,这就是为何我老是随身携带这个: element

public static void ForEach<T>(this IEnumerable<T> col, Action<T> action)
{
    if (action == null)
    {
        throw new ArgumentNullException("action");
    }
    foreach (var item in col)
    {
        action(item);
    }
}

不错的小扩展方法。 it


#4楼

在大多数状况下,该语言中已包含一个foreach语句。 io

我不想看到如下内容: 编译

list.ForEach( item =>
{
    item.DoSomething();
} );

代替: 扩展

foreach(Item item in list)
{
     item.DoSomething();
}

在大多数状况下 ,后者更清晰,更容易阅读,但输入可能要长一些。

可是,我必须认可我在这个问题上改变了立场; 在某些状况下,ForEach()扩展方法确实颇有用。

如下是语句和方法之间的主要区别:

  • 类型检查:foreach在运行时完成,ForEach()在编译时(Big Plus!)
  • 调用委托的语法确实要简单得多:objects.ForEach(DoSomething);
  • ForEach()能够被连接:虽然这种功能的邪恶/有用性能够讨论。

这些都是不少人在这里提出的很好的观点,我能够看出为何人们会错过这个功能。 我不介意微软在下一个框架迭代中添加标准的ForEach方法。


#5楼

若是您有F#(将在.NET的下一个版本中),您可使用

Seq.iter doSomething myIEnumerable

相关文章
相关标签/搜索