簡體   English   中英

這兩個linq表達式在功能上是等價的嗎?

[英]are these two linq expressions functionally equivalent?

是否有任何功能差異:

if (photos.Any(it => it.Archived))

if (photos.Where(it => it.Archived).Any())

如果是這樣,是否有更令人信服的理由使用一個而不是另一個?

從功能上講,他們做同樣的事情。 性能取決於特定的提供程序,但是例如在LINQ to SQL中,兩種形式都生成完全相同的SQL:

SELECT 
    (CASE 
        WHEN EXISTS(
            SELECT NULL AS [EMPTY]
            FROM [dbo].[photos] AS [t0]
            WHERE [t0].[Archived] = 1
            ) THEN 1
        ELSE 0
     END) AS [value]

如果我必須選擇一個,我會使用第一個選項,因為它似乎對我來說更加清晰。

沒有,是當前.NET Framework實現的方法沒有區別實際差別 由於延遲執行,兩者都會枚舉photos直到找到匹配,然后停止。 (假設這是Linq到對象 - 其他提供者可能表現不同)。

如果你想獲得挑剔,那么實施差異很小。 (您可以在框架源中查找):

Any簡單地使用foreach迭代集合,其中Where返回WhereArrayIteratorWhereListIteratorWhereEnumerableIterator具體取決於您傳入的集合類型。我沒有深入研究過這個問題,但我猜這是在為了在使用數組或列表的情況下允許鏈式擴展方法進行優化。

換句話說, Any包含一個簡單的foreach ,這Where

    if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate); 
    if (source is List<TSource>) return new WhereListIterator<TSource>((List<TSource>)source, predicate);
    return new WhereEnumerableIterator<TSource>(source, predicate);

作為表達式,它們產生相同的結果。 但是,產生這種結果的機制略有不同。 請注意,它們都會從原始序列中瀏覽相同數量的項目。

我會一直使用前者,因為它更短,並且在第二次選擇它時不會失去清晰度,可讀性和可維護性。

暫無
暫無

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

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