大的主观问题:我经常发现自己使用LINQ来过滤一组对象,然后在查询之后,做一个旧式的foreach来对每个结果执行一个动作.有没有一种很好的方法来组合这两个任务,以便对每个与Where()谓词匹配的对象执行操作?几乎就像将一个Action传递给Select().这可能不会编译,但是如果传入一个返回bool的Func,那么你可以将其嵌入另一个可以对失败或成功做某事的查询中.有人在生产代码中做过这个吗?这会被视为不良做法吗?还有其他想法吗?
很多人都要求一种ForEach
方法 - 事实上它很方便(这就是为什么我们在MoreLINQ中有一个).这也有潜在危险.
LINQ的大部分都坚定地阻止了副作用.他们是可能的,但气馁.这就是为什么OrderBy等返回新集合而不是排序现有集合.
现在考虑ForEach
- 这是一个"行动"而不是一个功能,因为它不会返回任何东西.如果它没有任何副作用,那绝对没有意义!因此,它违背了LINQ的部分理念 - 它基本上没有以功能性的方式接近事物.
我并不想提出充分的理由支持或反对,真的-在实践中,我认为有用的东西有,我并不感到惊讶,它在这么许多图书馆等,这是一个非常明显的伪操作的补充.只要想想你正在做什么,并注意到你正在引入副作用.它是LINQ的功能风格和更强制的编码风格之间的界限.
List
有一个ForEach()
专门为此设计的方法.