2010-09-10 43 views
0

既然LINQ是.NET的重要組成部分,那麼他們在編譯器級別上的優化是否會使用最佳路徑來獲取結果呢?LINQ在編譯器級別執行什麼類型的優化?

例如,假設您有一個整數數組並且想要獲得最低值。你可以在不使用LINQ的情況下使用foreach來做到這一點,但是在LINQ中使用Min函數肯定更容易。一旦使用LINQ編譯這個代碼,你最好完全跳過LINQ,還是把它轉換成類似於foreach的東西?

+0

喬恩斯威特在他的博客上寫了一篇關於那個(有點)的文章:http://msmvps.com/blogs/jon_skeet/archive/2010/02/10/optimisations-in-linq-to-objects.aspx – 2010-09-10 06:59:17

回答

2

C#編譯器根本就沒有做太多工作 - 它只是調用你告訴它的方法。

你可以說,去除不必要的選擇調用是一個優化:

from x in collection 
where x.Condition 
select x 

因爲編譯器可識別的身份轉變爲多餘的被編譯爲collection.Where(x => x.Condition),而不是collection.Where(x => x.Condition).Select(x => x)。 (形式from x in collection select x的簡併查詢不受此優化,但是,允許LINQ提供程序,以確保任何查詢經過至少一個他們的方法。)

的LINQ到對象Min方法只是做一個foreach,是的。各種LINQ to Objects方法do執行優化。例如,Count()將檢查數據源是否實現ICollectionICollection<T>,如果是,則使用Count屬性。正如madgnome在評論中指出的,前一段我在blog post中寫了更多關於這方面的內容。

當然,其他LINQ提供者可以執行自己的優化。