在找到 x 项后中止 linq 查询
本文关键字:linq 查询 | 更新日期: 2023-09-27 18:31:41
如果我知道集合中只有一个匹配的项目,有没有办法告诉 Linq 这件事,以便在找到它时中止搜索?
我假设这两个在返回一个项目之前都会搜索整个集合?
var fred = _people.Where((p) => p.Name == "Fred").First();
var bill = _people.Where((p) => p.Name == "Bill").Take(1);
编辑:人们似乎专注于FirstOrDefault
或SingleOrDefault
。这些与我的问题无关。如果集合为空,它们仅提供默认值。正如我所说,我知道我的收藏只有一个匹配的项目。
AakashM的评论是我最感兴趣的。我似乎我的假设是错误的,但我对为什么感兴趣。例如,当 linq to objects 在我的示例代码中运行 Where() 函数时,它如何知道对其返回值有进一步的操作?
你的假设是错误的。LINQ 大量使用延迟执行和延迟计算。这意味着,例如,当您调用 Where()
时,它实际上不会迭代集合。只有当您迭代它返回的对象时,它才会迭代原始集合。它会以懒惰的方式做到这一点:只
因此,在您的情况下,两个查询都不会迭代整个集合:两者都只会迭代它,直到找到第一个元素,然后停止。
实际上,第二个查询(带有 Take()
)甚至不会这样做,它只会在您迭代结果时迭代源集合。
这一切都适用于 LINQ to 对象。其他提供程序(LINQ to SQL 和其他提供程序)的行为可能有所不同,但至少延迟执行的原则通常仍然适用。
First()
不会扫描整个集合。它将在第一场比赛后立即返回。但我建议改用FirstOrDefault()
。
编辑:
First()
和 FirstOrDefault()
之间的区别(来自 MSDN):
如果源不包含任何元素,则 First()
方法将引发异常。若要改为在源序列为空时返回默认值,请使用 FirstOrDefault()
方法。
Enumerable.First