C# 惰性筛选列表

C# 惰性筛选列表,c#,C#,我有一个项目列表,我想从列表中选择3个满足谓词的项目 我已经试过了:(例子) list.Where(x=>x==2)。Take(3) list.Take(3)。其中(x=>x==2) 但它们当然不起作用 是否有一种机制,在.Take(3)完成之前,只选择满足谓词的元素 编辑:第一个示例的问题是,它首先选择匹配的每个元素,然后选择前3个元素。我只希望它选择,直到它已经采取了3。我想这只会影响到大量的收藏品,但仍然如此。或者我就是这么理解的 发生这种情况:(编辑:我错了) [1,2,2,3,4,5,

我有一个项目列表,我想从列表中选择3个满足谓词的项目

我已经试过了:(例子)

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

list.Take(3)。其中(x=>x==2)

但它们当然不起作用

是否有一种机制,在
.Take(3)
完成之前,只选择满足谓词的元素

编辑:第一个示例的问题是,它首先选择匹配的每个元素,然后选择前3个元素。我只希望它选择,直到它已经采取了3。我想这只会影响到大量的收藏品,但仍然如此。或者我就是这么理解的

发生这种情况:(编辑:我错了)

[1,2,2,3,4,5,2]。其中(x=>x==2)
=>
[2,2,2]。取(3)
=>
[2,2,2]

我想要像这样的东西:
[1,2,2,3,4,5,2]。其中(x=>x==2,3)
=>
[2,2,2]
,其中3是它在停止过滤之前匹配的元素数。

我假设您不理解linq的延迟执行。您的第一种方法正是您想要的:

list.Where(x => x == 2).Take(3)
它检查每个项目,直到找到三个与谓词匹配的项目

看看Eric Lippert对我问题的回答,因为他解释得很好:


这也值得一读:

第一个示例看起来不错,前提是您需要3个与谓词匹配的项。第二个不起作用,原因很明显。你的第一个例子应该起作用,所以你需要更具体地说明它是如何起作用的。请确保您确实试图枚举从
Take
返回的序列。为什么第一个示例不起作用?我已使用编辑进行了更新。您的编辑不正确,
其中
Take
都是惰性的,因此它将只搜索三个匹配项。一旦找到第三个,它将不会继续查找匹配项并丢弃它们。谢谢,我将在可能时选择此作为正确答案。