簡體   English   中英

LINQ中的WHERE和ANY之間哪個最快?

[英]Which is fast between WHERE and ANY in LINQ?

我有兩個linq表達式給出相同的結果。 任何人都可以解釋他們之間哪個快速,為什么?

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

要么

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

應該很快。 它僅檢查是否有可用數據,並返回true或false。 第二種方法應該返回對象。

Any()將在滿足您條件的第一個項目處停止迭代,並僅返回一個布爾值(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;
}

編輯:根據注釋-對於Where()表達式以過濾序列,實際上需要對其求值。 選擇的評估將確定您是否真正完成了整個序列。 因此,例如,如果您執行foreach打印出所有結果,則將遍歷整個序列。 在Where()上使用FirstOrDefault()可能還會獲得提前終止的好處。 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即可確保使用最快的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM