猿问

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

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

受另一个问题的启发,询问失踪的人Zip职能:

为什么没有ForEach中的可拓方法Enumerable班级,等级?或者任何地方?唯一一个获得ForEach方法是List<>..有什么原因导致它的缺失(表现)吗?


一只甜甜圈
浏览 462回答 3
3回答

阿晨1998

语言中已经包含了一个foreach语句,大多数时候都是这样做的。我不想看到以下情况:list.ForEach(&nbsp;item&nbsp;=>{ &nbsp;&nbsp;&nbsp;&nbsp;item.DoSomething();}&nbsp;);而不是:foreach(Item&nbsp;item&nbsp;in&nbsp;list){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.DoSomething();}后者更清晰易懂。在大多数情况下虽然打字的时间可能会长一点。但是,我必须承认,我改变了在这个问题上的立场;在某些情况下,ForEach()扩展方法确实是有用的。以下是声明和方法的主要区别:类型检查:Foreach是在运行时完成的,ForEach()是在编译时完成的(Big Plus!)调用委托的语法确实要简单得多:objects.ForEach(DoSomething);ForEach()可以链接起来:尽管这样一个特性的邪恶/有用性是可以讨论的。这些都是很多人提出的很好的观点,我能理解为什么人们会错过这个功能。我不介意微软在下一个框架迭代中添加一个标准的ForEach方法。

有只小跳蛙

您可以编写此扩展方法://&nbsp;Possibly&nbsp;call&nbsp;this&nbsp;"Do"IEnumerable<T>&nbsp;Apply<T>&nbsp;(this&nbsp;IEnumerable<T>&nbsp;source,&nbsp;Action<T>&nbsp;action){ &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;e&nbsp;in&nbsp;source) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action(e); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;return&nbsp;e; &nbsp;&nbsp;&nbsp;&nbsp;}}行家允许链接:MySequence &nbsp;&nbsp;&nbsp;&nbsp;.Apply(...) &nbsp;&nbsp;&nbsp;&nbsp;.Apply(...) &nbsp;&nbsp;&nbsp;&nbsp;.Apply(...);反方它实际上不会做任何事情,除非你做一些强制迭代的事情。因此,它不应该被称为.ForEach()..你可以写.ToList()最后,也可以编写这个扩展方法://&nbsp;possibly&nbsp;call&nbsp;this&nbsp;"Realize"IEnumerable<T>&nbsp;Done<T>&nbsp;(this&nbsp;IEnumerable<T>&nbsp;source){ &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;e&nbsp;in&nbsp;source) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;do&nbsp;nothing &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;source;}这可能与交付的C#库有太大的不同;不熟悉扩展方法的读者将不知道如何处理您的代码。
随时随地看视频慕课网APP
我要回答