使用LINQ循环并执行操作而不仅仅是选择数据是不好的做法吗?

时间:2009-02-20 21:17:22

标签: .net linq

大主观问题:我经常发现自己使用LINQ来过滤一组对象,然后在查询之后,做一个老式的foreach来对每个结果执行操作。有没有一种很好的方法来组合这两个任务,以便对每个与Where()谓词匹配的对象执行操作?几乎就像将一个Action传递给Select()。这可能不会编译,但是如果传入一个返回bool的Func,那么你可以将其嵌入另一个可以对失败或成功做某事的查询中。有人在生产代码中做过这个吗?这会被视为不良做法吗?还有其他想法吗?

3 个答案:

答案 0 :(得分:11)

很多人都要求ForEach方法 - 而且确实方便(这就是为什么我们在MoreLINQ中有一个)。它也可能危险。

LINQ的大多数人都坚决不鼓励副作用。他们是可能的,但气馁。这就是为什么OrderBy等会返回新的集合而不是对现有的集合进行排序。

现在考虑ForEach - 它是一个“动作”而不是一个函数,因为它不返回任何东西。如果它没有任何副作用,那绝对没有意义!因此,它违背了LINQ哲学的一部分 - 它基本上不是以功能性方式处理事物。

我不是想要提出或反对,实际上,在实践中,我觉得有用的东西,我并不感到惊讶它在所以许多库等。这是一个非常明显的伪运算符。只要想想你正在做什么,并注意到你正在引入副作用。它是LINQ的功能风格和更强制的编码风格之间的界限。

答案 1 :(得分:8)

List<T>有一个专为此设计的ForEach()方法。

答案 2 :(得分:2)

您可以在IEnumerable上实现扩展ForEach方法。