2010-03-11 145 views
2

這兩個陳述中的哪一個更快/更好的做法?Linq方法體最佳實踐問題

myList.Where(x => 
      { 
       bool itemOne= x.ItemOne == paramItemOne; 
       bool itemTwo = x.ItemTwo == paramItemTwo; 
       return itemOne && itemTwo; 
      }) 


myList.Where(x => x.ItemOne == paramItemOne).Where(x=>x.ItemTwo == paramItemTwo) 

or they are the same?

回答

7

我不會說。最快的將是:

myList.Where(x => x.ItemOne == paramItemOne && x.ItemTwo == paramItemTwo) 

(假定編譯器/ JIT不優化掉在第一形式的變量賦值)

第二種形式將是慢,因爲它可能涉及顯著多個方法調用提供給Where語句的代表。

+1

編譯器無法優化第一種形式的第二個布爾值 - 它會消除副作用。 – SLaks 2010-03-11 22:21:13

0

表現會相同或非常接近。第二個可能會有更多的方法開銷。

比性能更重要的是,我會說第一個是更好的做法,因爲它是更加清晰

1

結果都是一樣的,但是,我建議你,而不是寫:

myList.Where(x => 
      { 
       return x.ItemOne == paramItemOne && x.ItemTwo == paramItemTwo; 
      }); 

這是保證工作得更快,因爲現在x.ItemTwo == paramItemTwo將不被計算,甚至如果x.ItemOne == paramItemOne

+0

呃......這兩個條件都必須滿足,所以你的最終斷言不成立。兩個謂詞都必須進行AND評估才能評估爲真。然而,在x.ItemOne!= paramItemOne的情況下,第二個謂詞將不被計算,但這也適用於Where()。Where()表單,因爲由第一個Where語句過濾的項目不會成爲第二個Where執行的枚舉。 – spender 2010-03-12 00:28:02

0

首先檢查每個列表項目的兩個條件。 第二個條件過濾器,然後過濾第二個條件的結果。

第二個是創建並填充另一個臨時集合,但較少比較第二個條件。