我有一个项目列表,我想从该列表中选择 3 个满足谓词的项目。
我试过这个:(示例)
list.Where(x => x == 2).Take(3)
list.Take(3).Where(x => x == 2)
但是它们当然不起作用。
是否有一种机制只选择满足谓词的元素,直到满足.Take(3)
?
编辑:第一个示例的问题在于它首先选择匹配的每个元素,然后采用前 3 个。我只希望它选择直到它花了 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 是它在停止过滤之前匹配的元素数。
我假设你还没有理解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