2013-12-12 44 views
2

http://codepaste.net/4xzv9k是codepaste鏈接,顯示的C#代碼(很抱歉,但我不能讓代碼看這裏)與Cast相比,爲什麼.ToList()是瓶頸?示例代碼如下

我的問題是,爲什麼像下面這樣的簡單的查詢是如此之快的投而不是一個.ToList擴展名:

//fast: 
     for (int i = 0; i < iterations; i++) 
     { 
       var queryShortWay1 = productList.OrderBy(a => a.ProductName).Where(a => 
       a.ProductName.Length < 99); 

      mySecondProductLst = queryShortWay1 as List<Product>; //fast CAST 


     } 

    //slow: 

     for (int i = 0; i < iterations; i++) 
     { 
      var queryLongWay1 = productList.OrderBy(a => a.ProductName).Where(a => 
       a.ProductName.Length < 99); 
      MyProductList = queryLongWay1.ToList(); //slow 

     } 

你會認爲.ToList沒有那麼慢,但它至少是一個數量級。有什麼理由?

回答

5

我會想象,首先是快,因爲它只是因爲queryShortWay1設置mySecondProductLstnull不是List<Product>(這是最有可能IQueryable<Product>型或IEnumerable<Product>的)。查詢不在這裏執行。

第二個「慢」示例實際上是執行您的查詢。

這裏雖然真正的關鍵是LINQ查詢執行被推遲 - 這意味着該查詢將直到它被遍歷,而不是實際執行是否通過一個循環,以ToList()一個電話,或其他方式。也就是說,單獨設置變量queryShortWay1queryLongWay1不會導致查詢執行。

+0

好吧,你是正確的Ic事實上,'快速'的方式並沒有做任何事情,只是創建mySecondProductLst = null。對我而言,好消息是我多年來一直以「緩慢」的方式(正確的方式)進行這項工作,但我認爲我只是以一種更快的方式偶然發現,但我錯了。將接受你的答案是正確的。 – PaulDecember