2012-10-25 58 views
0

我在Bill Wagners Book中閱讀了「Effective C#」,應該支持更多的聲明式選擇對傳統循環的聲明(對於)。與select的性能

例如:

int[] foo = new int[1000]; 
for (int i = 0; i < foo.Length; i++) 
    foo[i] = i * i; 

是傳統的命令性代碼,而這將是聲明的Linq代碼:

int[] foo2 = (from i in Enumerable.Range(0, 1000) 
       select i * i).ToArray(); 

作爲一個老式的程序員,我更喜歡第一個版本。

問題是如何表現?我想第一個版本也更快。

+0

好的人。相反,如果投票我自己的答案,告訴我我錯在哪裏... – Knasterbax

+0

你的答案是不是很「公平」的選擇。 Enumerable.Range(0,n),ToArray()等會花費額外的時間!使用常量要快得多!查看我的答案,瞭解有關選擇和LINQ功能的詳細信息。 –

+3

@Knasterbax,你爲什麼要用c#?作爲oldschool程序員,你必須更喜歡Assembler。 –

回答

3

for方式會更快!因爲不會有任何LINQsided表達式樹評估/優化等......

但是,使用select的真正利潤是「延期執行」。

當程序指針位於放置for的代碼部分時,for循環將立即執行。只有在需要時纔會執行select語句。

+0

我認爲他的例子有點假,在這種情況下,他甚至不會因爲ToArray()而推遲執行。 –

+1

看看我的評論在主帖;) –

+2

與Linq的對象('IEnumerable ')沒有表達式樹評估 – Wasp