2012-09-28 79 views
0

按照此鏈接:http://msdn.microsoft.com/en-us/library/bb397906.aspx的LinQ:查詢時將執行

namespace Linq 
{ 
    class IntroToLINQ 
    { 
     static void Main() 
     { 
      // The Three Parts of a LINQ Query: 
      // 1. Data source. 
      int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; 

      // 2. Query creation. 
      // numQuery is an IEnumerable<int> 
      var numQuery = 
       from num in numbers 
       where (num % 2) == 0 
       select num; 

      // 3. Query execution. 
      foreach (int num in numQuery) 
      { 
       Console.Write("{0,1} ", num); 
      } 
     } 
    } 

} 

它說,查詢將不會被exeucted,直到數據通過foreach進行迭代。但是當我調試時,var(resultviews)的數據記憶包含執行foreach之前的結果值。爲什麼發生這種情況?

回答

0

因爲您的調試器正在爲您執行查詢。

Linq正在使用稱爲延遲執行的東西。這裏有一篇很好的博客文章解釋它:LINQ and Deferred Execution

當你第一次執行迭代器時,查詢被處理並執行(在內存中,數據庫或其他方式)。你的調試器會爲你做這個。

就拿下面的代碼(可以在控制檯應用程序粘貼):

using System; 
using System.Diagnostics; 
using System.Linq; 

namespace Stackoverflow 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var numbers = Enumerable.Range(0, 100).ToList(); 

      var filteredNumbers = from n in numbers 
            where n > 50 
            select n; 

      Debugger.Break(); 

      foreach(int f in filteredNumbers) 
      { 
       Console.WriteLine(f); 
      } 

     } 
    } 
} 

當你看到filteredNumbers上Debugger.Break()語句,你會看到以下內容:

Debug view of Linq Enumerable

結果視圖選項的值爲:「展開結果視圖將枚舉IEnumerable」。這就是調試器中發生的事情。

0

當您使用調試器查看變量時,Visual Studio正在執行迭代器。這就是你看到結果的原因。

出於同樣的原因,您不應該在監視窗口中放置i++,因爲代碼實際上是執行的。