31. LINQ 지연 실행과 다중 열거의 함정

난이도 중 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C#
// 주제: LINQ 지연 실행(deferred execution)과 다중 열거(multiple enumeration)
//
// 과제:
//  1) 아래 프로그램의 출력을 순서까지 예측하라.
//  2) 쿼리를 "만드는 시점"과 "열거하는 시점"이 어떻게 분리되는지(지연 실행),
//     Count()/First() 가 각각 소스를 언제 다시 열거하는지 설명하라.
//  3) 이 코드가 부수효과(로그·네트워크·DB 조회)를 가진 소스에서 왜 위험한지,
//     ToList()/ToArray() 로 어떻게 고치는지 설명하라. (설명은 answer.md 에)

using System;
using System.Collections.Generic;
using System.Linq;

public static class Program
{
    private static IEnumerable<int> Source()
    {
        Console.WriteLine("Source: begin");
        for (int i = 1; i <= 3; i++)
        {
            Console.WriteLine($"Source: yield {i}");
            yield return i;
        }
    }

    public static void Main()
    {
        var query = Source().Where(x =>
        {
            Console.WriteLine($"filter {x}");
            return x % 2 == 1;   // 홀수만
        });

        Console.WriteLine("query built");

        int count = query.Count();
        Console.WriteLine($"count={count}");

        int first = query.First();
        Console.WriteLine($"first={first}");
    }
}
내 리뷰 · C#
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.