2013-10-16 73 views
2

我有一个项目列表,我想从列表中选择满足谓词的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

第一个例子看起来不错,只要你想匹配的是3项谓词。第二个不起作用的原因很明显。 –

+1

您的第一个示例应该可以工作,因此您需要更具体地了解它没有。确保你实际上试图枚举从'Take'返回的序列。 – Lee

+0

为什么你的第一个例子不起作用? –

回答

8

我假设你还没有理解linq的延期执行。你的第一种方法正是你想要的:

list.Where(x => x == 2).Take(3) 

它检查每个项目,但直到它找到三个项目匹配的谓词。

看一看埃里克Lipperts回答我的问题,因为他的说法很好:https://stackoverflow.com/a/10110269/284240

这也是值得一读:http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx

+0

谢谢,我会尽可能选择这个作为正确的答案。 – ptf