懒惰过滤列表

时间:2013-10-16 11:01:44

标签: c#

我有一个项目列表,我想从该列表中选择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是在停止过滤之前匹配的元素数。

1 个答案:

答案 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