LINQ中的WHERE和ANY之间哪个速度快

本文关键字:速度快 之间 ANY 中的 WHERE LINQ | 更新日期: 2023-09-27 18:01:17

我有两个linq表达式给出相同的结果。有人能解释一下他们之间哪个速度快,为什么?

if (lstEmployees.Where(cond => cond.EmployeeID == empID).Select(col => col.IsManager).FirstOrDefault())
{
...
}

if (lstEmployees.Any(cond => cond.EmployeeID == empID && cond.IsManager))
{
...
}

LINQ中的WHERE和ANY之间哪个速度快

理论上的

lstEmployees.Any(cond => cond.EmployeeID == empID && cond.IsManager)

应该更快或相等。因为它将通过一个迭代循环完成所有必要的操作。但实际上,这在很大程度上取决于LINQ提供商。供应商有可能优化

lstEmployees.Where(cond => cond.EmployeeID == empID).Select(col => col.IsManager).FirstOrDefault()

到更简单的查询,你不会觉得有任何区别。

但我认为最好使用这里的Any,因为它更短,业务逻辑更清晰易懂。

Any在您的情况下会更正确。因为Any将在满足您条件的集合中的第一个实体上返回true,但FirstOrDefault在您的情况下(从性能的角度来看(也会这样做。当FirstOrDefault可能更慢时,唯一的情况是使用第三方数据连接器和bad实现将linq表达式转换为SQL查询时。

因此,通常只需使用Any即可确保使用最快的解决方案。

Any((将在满足条件的第一个项处停止迭代,并简单地返回一个bool(true=found或false not found(。Where((将继续执行整个序列,以便它可以返回条件匹配的项的完整结果。总之,如果你只需要知道一个条件是否为真至少一次,而不关心满足你条件的实际项目,那么Any((是你更快的解决方案。

以下是Any((的实现。看看它是如何在谓词返回true后立即退出foreach循环的。

public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
    if (source == null) throw Error.ArgumentNull("source");
    if (predicate == null) throw Error.ArgumentNull("predicate");
    foreach (TSource element in source) {
        if (predicate(element)) return true;
    }
    return false;
}

EDIT:根据注释-对于Where((表达式,要过滤实际需要计算的序列。所选择的评估将决定你是否真的完成了整个序列。因此,例如,如果你用foreach打印出所有结果,你将完成整个序列。在Where((上使用FirstOrDefault((也可以获得提前终止的好处。Any((将立即求值。

lstEmployees.Any(cond => cond.EmployeeID == empID && cond.IsManager)

它应该很快。它只是检查数据是否可用,并返回true或false。第二个方法应该返回对象。