[c#] 다음 LINQ 문은 어떻게 작동합니까?

다음은 어떻게합니까 LINQ 문 작동합니까?

내 코드는 다음과 같습니다.

var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0);
list.Add(8);
foreach (var i in even)
{
    Console.WriteLine(i);
}

산출: 2, 4, 6, 8

왜 안돼 2, 4, 6?



답변

결과는 실행 지연 으로 2,4,6,8인한 것입니다 .

쿼리 변수가 만들어 질 때가 아니라 쿼리 변수가 반복 될 때 쿼리가 실제로 실행됩니다. 이것을 지연된 실행이라고합니다.

-Suprotim Agarwal, “LINQ에서 지연된 쿼리와 즉각적인 쿼리 실행”

쿼리 결과를 캐싱하는 데 유용한 Immediate Query Execution 이라는 또 다른 실행이 있습니다 . Suprotim Agarwal에서 다시 :

단일 값을 생성하지 않는 쿼리를 즉시 실행하려면 쿼리 또는 쿼리 변수 에서 ToList(), ToDictionary(), ToArray(), Count(), Average()또는 Max()메서드를 호출하면 됩니다. 이를 변환 연산자라고하며 결과를 복사 / 스냅 샷 할 수 있으며 쿼리를 다시 실행할 필요없이 원하는만큼 액세스 할 수 있습니다.

출력을 원하면 다음을 2,4,6사용하십시오 .ToList().

var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0).ToList();
list.Add(8);
foreach (var i in even)
 {
    Console.WriteLine(i);
 }


답변

이는 지연된 실행으로 인해 발생했습니다. 즉, 표현식 계산은 어딘가에 필요할 때까지 실행되지 않습니다. 데이터가 너무 큰 경우 성능이 향상됩니다.


답변

그 이유는 람다 식의 지연된 실행 때문입니다. foreach 루프에서 반복을 시작하면 쿼리가 실행됩니다.


답변

LINQ에서 얻은 IEnumerable <>을 사용하면 열거 자 클래스 만 만들어지고 일부 워크 스테이션에서 사용하는 경우에만 반복이 시작됩니다.


답변

지연된 실행으로 인해이 결과를 얻습니다. 즉, 결과는 처음 액세스 할 때까지 실제로 평가되지 않습니다.

더 명확하게하기 위해 스 니펫 끝에 10을 목록에 추가하고 다시 인쇄하면 10을 출력하지 않습니다.

     var list = new List<int>{1,2,4,5,6};
    var even = list.Where(m => m%2 == 0).Tolist();
    list.Add(8);
    foreach (var i in even)
    {
        Console.WriteLine(i);
    }
//new*
    list.Add(10);
    foreach (var i in even)
    {
        Console.WriteLine(i);
    }


답변