找到x项后中止linq查询?

Gaz*_*yer 1 c# linq take

如果我知道集合中只有一个匹配的项目,是否有任何方法可以告诉Linq这样,以便在找到它时中止搜索?

我假设这两个在返回一个项目之前搜索完整的集合?

var fred = _people.Where((p) => p.Name == "Fred").First();
var bill = _people.Where((p) => p.Name == "Bill").Take(1);
Run Code Online (Sandbox Code Playgroud)

编辑:人们似乎注意到FirstOrDefault,或SingleOrDefault.这些与我的问题无关.如果集合为空,它们只是提供默认值.正如我所说,我知道我的收藏品有一个匹配的项目.

AakashM的评论对我来说最感兴趣.我觉得我的假设是错的,但我很感兴趣.例如,当linq to objects在我的示例代码中运行Where()函数时,它如何知道对其返回值有进一步的操作?

svi*_*ick 5

你的假设是错误的.LINQ使用延迟执行和惰性求值.这意味着,例如,当您调用时Where(),它实际上不会迭代集合.只有当你迭代它返回的对象时,它才会迭代原始集合.它会以一种懒惰的方式做到这一点:只有必要.

因此,在您的情况下,任何查询都不会迭代整个集合:两者都将迭代它直到找到第一个元素的点,然后停止.

实际上,第二个查询(with Take())甚至不会这样做,它只会在迭代结果时迭代源集合.

这一切都适用于LINQ to objects.其他提供程序(LINQ to SQL和其他提供程序)的行为可能不同,但至少延迟执行的原则通常仍然存在.