다음은 어떻게합니까 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
?
다음은 어떻게합니까 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);
}
.First()
, .FirstOrDefault()
, .Single()
및 .SingleOrDefault()
또한 쿼리의 평가를 트리거합니다.
지연된 실행으로 인해이 결과를 얻습니다. 즉, 결과는 처음 액세스 할 때까지 실제로 평가되지 않습니다.
더 명확하게하기 위해 스 니펫 끝에 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);
}
10
출력을 얻는다 .
8
두 출력에 포함되지 않습니다 .