为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只甜甜圈 2019-07-11 16:42:30
为什么在IEnumerable上没有ForEach扩展方法?受另一个问题的启发,询问失踪的人Zip职能:为什么没有ForEach中的可拓方法Enumerable班级,等级?或者任何地方?唯一一个获得ForEach方法是List<>..有什么原因导致它的缺失(表现)吗?
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

语言中已经包含了一个foreach语句,大多数时候都是这样做的。

我不想看到以下情况:

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

而不是:

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

后者更清晰易懂。在大多数情况下虽然打字的时间可能会长一点。

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

以下是声明和方法的主要区别:

  • 类型检查:Foreach是在运行时完成的,ForEach()是在编译时完成的(Big Plus!)
  • 调用委托的语法确实要简单得多:objects.ForEach(DoSomething);
  • ForEach()可以链接起来:尽管这样一个特性的邪恶/有用性是可以讨论的。

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


查看完整回答
反对 回复 2019-07-11
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

您可以编写此扩展方法:

// Possibly call this "Do"IEnumerable<T> Apply<T> (this IEnumerable<T> source, Action<T> action){
    foreach (var e in source)
    {
        action(e);
        yield return e;
    }}

行家

允许链接:

MySequence
    .Apply(...)
    .Apply(...)
    .Apply(...);

反方

它实际上不会做任何事情,除非你做一些强制迭代的事情。因此,它不应该被称为.ForEach()..你可以写.ToList()最后,也可以编写这个扩展方法:

// possibly call this "Realize"IEnumerable<T> Done<T> (this IEnumerable<T> source){
    foreach (var e in source)
    {
        // do nothing
        ;
    }

    return source;}

这可能与交付的C#库有太大的不同;不熟悉扩展方法的读者将不知道如何处理您的代码。


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 461 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信