我有一个项目列表,我想从该列表中选择3个项目来完成谓词。
我试过这个:(例子)
list.Where(x => x == 2).Take(3)
list.Take(3).Where(x => x == 2)
但他们当然不行。
是否有一种机制只能在满足.Take(3)
之前选择符合谓词的元素?
这种情况发生了:( 编辑:我错了)
[1, 2, 2, 2, 3, 4, 5, 2].Where(x => x == 2)
=> [2, 2, 2, 2].Take(3)
=> [2, 2, 2]
我想要的东西:
[1, 2, 2, 2, 3, 4, 5, 2].Where(x => x == 2, 3)
=> [2, 2, 2]
,其中3是在停止过滤之前匹配的元素数。
答案 0 :(得分:8)
我认为你不理解linq的延期执行。您的第一种方法完全符合您的要求:
list.Where(x => x == 2).Take(3)
它会检查每个项目,直到它找到三个与谓词匹配的项目。
看看Eric Lipperts对我的问题的回答,因为他解释得非常好:https://stackoverflow.com/a/10110269/284240
这也值得一读:http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx