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#
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.