2010-09-08 33 views
14

可能是一個愚蠢的問題,但我有很多:如果更換(X)的foreach()與Foreach.Where(X)

if(X) 
{ 
    foreach(var Y in myList.Where(z => z == 1) 
    { 
    } 
} 

結構中的某些代碼

替換它
foreach(var Y in myList.Where(z => X && z == 1) { } 

瘋了嗎?

它可能不太可讀,但編譯器是否會優化它以使它幾乎相同的代碼?

+1

避免?爲什麼要避免這種情況? – Yagzii 2015-03-11 16:29:42

回答

19

不,您的第一個版本更好,更快。當X爲真時,第二個版本將針對序列中的每個元素評估X

你應該堅持第一個版本。

4

當x爲false時,第二個選項會慢很多,因爲當您知道檢查總是失敗時,您正在使用linq檢查列表中的所有項目。

編譯器優化器將無法撤消您的損害。這種優化級別通常只能用於函數式語言,因爲編譯器很難跟蹤可能的副作用。

Linq沒有內置任何優化內容,這些優化內容與您期望從數據庫中的SQL查詢重寫器期望的內容相近。

1

它們不會編譯成相同的代碼。在第二個版本中,X被多次評估,並且myList被枚舉。最糟糕的情況是評估X更改的東西,並且你有不可預知的功能。