在找到 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);

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

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

在找到 x 项后中止 linq 查询

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

在必要时进行。

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

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

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

我认为

First()不会扫描整个集合。它将在第一场比赛后立即返回。但我建议改用FirstOrDefault()

编辑:

First()FirstOrDefault() 之间的区别(来自 MSDN):

如果源不包含任何元素,则 First() 方法将引发异常。若要改为在源序列为空时返回默认值,请使用 FirstOrDefault() 方法。

Enumerable.First