2012-09-28 6 views
0

이 링크를 당으로서 : HTTP :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); 
      } 
     } 
    } 

} 

//msdn.microsoft.com/en-us/library/bb397906.aspx 그것은 쿼리 exeucted되지 않습니다 상태, 데이터가 foreach를 통해 반복 될 때까지. 그러나 디버깅 할 때 var (resultviews)의 데이터 멤버는 foreach를 실행하기 전에 결과 값을 포함합니다. 왜 이런 일이 일어나는거야?

답변

0

디버거가 사용자 대신 쿼리를 실행하고 있기 때문입니다.

Linq는 지연 실행이라고하는 것을 사용하고 있습니다. 그것을 설명하는 좋은 블로그 게시물은 다음과 같습니다 : LINQ and Deferred Execution.

이터레이터를 처음 실행하면 쿼리가 처리되고 실행됩니다 (메모리, 데이터베이스 또는 다른 방식으로). 디버거가 대신이 작업을 수행합니다. 다음 코드는 (당신이 콘솔 응용 프로그램이 붙여 넣을 수 있습니다) 예를 들어

테이크 :

: 당신이 Debugger.Break() 문에 filteredNumbers 볼 때

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); 
      } 

     } 
    } 
} 

는 다음을 참조합니다

Debug view of Linq Enumerable

결과보기 옵션에는 값이 있습니다. "결과보기를 확장하면 IEnumerable이 열거됩니다." 이것이 바로 디버거에서 발생합니다.

0

디버거를 사용하여 변수를 보면 Visual Studio에서 반복기를 실행하고 있습니다. 그것이 결과를 보는 이유입니다.

코드가 실제로 실행되기 때문에 시계 창에 i++을 넣으면 안되는 것과 같은 이유 때문입니다.

관련 문제