2013-05-18 62 views
0

我坐在這間多雲星期六上午心中暗想:連接條件和多個Where方法調用之間有區別嗎?

IEnumerable<SomeType> 
    someThings = ..., 
    conjunctedThings = someThings.Where(thing => thing.Big && thing.Tall), 
    multiWhereThings = someThings 
    .Where(thing => thing.Big).Where(thing => thing.Tall); 

直觀地說,我會說,conjunctedThings將被計算不慢於multiWhereThings但真的在一般情況下,有區別嗎?

我可以想象,如果大事和高大的份額取決於份額,計算可能會以不同的方式進行,但我想忽略這一方面。

我還需要考慮其他任何屬性嗎?例如。可枚舉類型或其他什麼?

+1

這取決於_「...」_真的。例如,看看實體框架。無論您是在每個條件下使用Where,還是在每個條件下使用Where,在調用枚舉器時,所有的Where都將被壓縮到一個SQL WHERE中。 – CodeCaster

+0

@CodeCaster謝謝。除了我提到的那些之外,請注意圍繞依賴項繪製一些線條? –

+2

「Conjuncted」(awesome word btw)'Where'和'Select'查詢通過LINQ to Objects優化。任何時候你有一個表現問題,你最好的選擇是**拿出一個秒錶,並嘗試兩種方式**。然後你就會知道。任何你在這裏得到的答案都是猜測。如果有性能問題,則無法替代測量。 –

回答

1

一般而言,MultiWhere會變慢。它需要處理更多的項目並調用更多的lambda表達式。

0

如果someThings包含n項目,其中mBig然後conjucated-東西拉姆達被稱爲n倍,而Lambda表達式爲多,其中被稱爲n+m倍。如果兩個序列的用戶打算重複全部的內容,則這是正確的。由於Where方法在內部執行yield return,因此取決於集合的用戶,迭代次數可能較少。換句話說,上面的數字是最壞情況的估計。

+0

我感謝您的回覆。我只想指出,這個特別的考慮已經包含在我的問題中(儘管我可以承認它可能會更清楚)。顯然,大人物和高個子女的比例,就像你說的那樣。還有什麼? –

相關問題