C# - LINQ 지연 실행 (Deferred execution)
지연 실행(Deferred execution)이란 LINQ 구문이 코드가 작성된 위치가 아닌 요청 받은 시점에 이루어 지는 것을 의미 합니다. 아래 예제를 보시죠.
muxResult는 nums의 각 항목에 mux의 값을 곱합니다. Select 문은 코드의 위치가 아닌 실제로 muxResult가 요청되는 시점에 수행 되고, 그 시점의 mux 값인 3이 곱해집니다.
var nums = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int mux = 2;
var muxResult = nums.Select(n => n * mux);
mux = 3;
Console.WriteLine(string.Join(", ", muxResult)); // 여기서 Select가 실행 된다.
// 수행 결과
// 3, 6, 9, 12, 15, 18, 21, 24, 27, 30
그리고, LINQ 구문은 요청 되는 시점마다 수행 됩니다. 아래 코드에서 nums.Where()는 5번 수행 됩니다. 만약 미리 홀수 숫자를 구해 놓고 반복문을 수행하려 했다면 잘 못된 접근 입니다. 특히 LINQ 구문이 비싼 연산을 수행 한다면 주의 해야 합니다.
var nums = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var odd = nums
.Where(n => n % 2 == 1);
for (int i = 0; i < 5; i++)
{
Console.WriteLine(string.Join(", ", odd)); // 수행마다 Where가 호출 된다.
}
for문 수행 마다 Where를 수행하기 싫다면 odd를 미리 컬렉션으로 저장해 놓습니다.
var nums = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var odd = nums
.Where(n => n % 2 == 1)
.ToList(); // 이순간 Where가 수행 되고 odd는 list가 된다.
for (int i = 0; i < 5; i++)
{
Console.WriteLine(string.Join(", ", odd));
}
지연 실행 되는 LINQ 구문은 아래를 참고 해 주세요.
Classification of Standard Query Operators by Manner of Execution (C#)