c# - 找到 x 项后中止 linq 查询?

标签 c# linq take

如果我知道集合中只有一个匹配项目,有没有什么办法可以告诉 Linq 这件事,以便它在找到它时中止搜索?

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

var fred = _people.Where((p) => p.Name == "Fred").First();
var bill = _people.Where((p) => p.Name == "Bill").Take(1);

编辑:人们似乎专注于 FirstOrDefaultSingleOrDefault。这些与我的问题无关。如果集合为空,它们只是提供一个默认值。正如我所说,我知道我的收藏中有一个匹配项目。

我最感兴趣的是 AakashM 的评论。我会出现我的假​​设是错误的,但我很感兴趣为什么。 例如,当 linq to objects 在我的示例代码中运行 Where() 函数时,它如何知道对其返回值有进一步的操作?

最佳答案

你的假设是错误的。 LINQ 使用延迟执行和 lazy evaluation很多。这意味着,例如,当您调用 Where() 时,它实际上并没有迭代集合。只有当你迭代它返回的对象时,它才会迭代原始集合。而且它会以一种懒惰的方式进行:只做必要的事情。

因此,在您的情况下,两个查询都不会迭代整个集合:两者都只会迭代到找到第一个元素的位置,然后停止。

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

这都适用于 LINQ to objects。其他提供程序(LINQ to SQL 等)的行为可能有所不同,但至少延迟执行的原则通常仍然成立。

关于c# - 找到 x 项后中止 linq 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10244194/

相关文章:

haskell - 在haskell中制作takeUntil函数

c# - 像 StackoverFlow 一样设置日期时间格式

c# - 你应该如何使用 NUnit 3.2?

linq - 将对象写入表时超过 8060 字节 - Windows Phone 7.5

c# - Linq 从嵌套元素加入和投影

c# - 从字典中取出 n 个元素

linq - Entity Framework -Linq : how query to take 2 first ordered and grouped list

c# - Mysql C# 无法连接到主机,但它可以

c# - 创建 Cookie ASP.NET 和 MVC

c# - 如何使用 linq 进行计数和分组