大主观问题:我经常发现自己使用LINQ来过滤一组对象,然后在查询之后,做一个老式的foreach来对每个结果执行操作。有没有一种很好的方法来组合这两个任务,以便对每个与Where()谓词匹配的对象执行操作?几乎就像将一个Action传递给Select()。这可能不会编译,但是如果传入一个返回bool的Func,那么你可以将其嵌入另一个可以对失败或成功做某事的查询中。有人在生产代码中做过这个吗?这会被视为不良做法吗?还有其他想法吗?
答案 0 :(得分:11)
很多人都要求ForEach
方法 - 而且确实方便(这就是为什么我们在MoreLINQ中有一个)。它也可能危险。
LINQ的大多数人都坚决不鼓励副作用。他们是可能的,但气馁。这就是为什么OrderBy等会返回新的集合而不是对现有的集合进行排序。
现在考虑ForEach
- 它是一个“动作”而不是一个函数,因为它不返回任何东西。如果它没有任何副作用,那绝对没有意义!因此,它违背了LINQ哲学的一部分 - 它基本上不是以功能性方式处理事物。
我不是想要提出或反对,实际上,在实践中,我觉得有用的东西,我并不感到惊讶它在所以许多库等。这是一个非常明显的伪运算符。只要想想你正在做什么,并注意到你正在引入副作用。它是LINQ的功能风格和更强制的编码风格之间的界限。
答案 1 :(得分:8)
List<T>
有一个专为此设计的ForEach()
方法。
答案 2 :(得分:2)
您可以在IEnumerable上实现扩展ForEach方法。