다음은 어떻게합니까 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);
}