为什么 IEnumerable 没有 ForEach 扩展方法?

40 浏览
0 Comments

为什么 IEnumerable 没有 ForEach 扩展方法?

受另一个问题的启发,该问题询问缺失的Zip函数:

为什么IEnumerable接口上没有ForEach扩展方法?或者没有任何地方有它?唯一获取ForEach方法的类是List<>。是否有缺失的原因,也许是性能?

admin 更改状态以发布 2023年5月23日
0
0 Comments

在LINQ之前,ForEach方法被添加了。如果你添加ForEach扩展,它永远不会被List实例调用,因为扩展方法受到约束。我认为没有添加的原因是为了不干扰现有的方法。

然而,如果你真的想要这个小巧玲珑的函数,你可以自己编写版本。

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

0
0 Comments

语言内部已经包含了大多数情况下可以完成工作的foreach语句。

我不希望看到以下情况:

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

而不是:

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

在大多数情况下,后者更清晰、更易于阅读,虽然可能打字更长一些。

然而,我必须承认,我在这个问题上改变了态度;在某些情况下,一个ForEach()扩展方法确实是有用的。

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

  • 类型检查:foreach在运行时完成,ForEach()在编译时完成(大加分!)
  • 调用委托的语法确实简单得多:objects.ForEach(DoSomething);
  • ForEach()可以链接:虽然这种功能的恶意/有用性有待讨论。

这些都是许多人在这里提出的很好的观点,我可以理解为什么人们会想念这个函数。我不介意微软在下一个框架迭代中添加一个标准的ForEach方法。

0