다음 스 니펫은 콘솔에서 1부터 10까지를 인쇄하지만 변수 'i'가 int.MaxValue에 도달 할 때까지 종료되지 않습니다. 내가 빠진 것을 지적하기위한 TIA.지연된 실행 종료시 도움이 필요함
class Program
{
public static IEnumerable<int> GetList()
{
int i = 0;
while (i < int.MaxValue)
{
i++;
yield return i;
}
}
static void Main(string[] args)
{
var q = from i in GetList() // keeps calling until i reaches int.MaxValue
where i <= 10
select i;
foreach (int i in q)
Console.WriteLine(i);
}
}
반복자는 실제로 "알고있다"- 호출 코드는 단순히'호출 중지를 MoveNext', resp. '현재'와 항복. OP 코드의 문제점은 iterator에'i <= 10)'술어를 적용하는 쿼리라는 것입니다. 모든 레코드를 쓰는 것은 모든 데이터를 반복하는 것을 의미합니다. 쿼리가 식 (Linq에서 SQL 등)으로 실행되면 이야기가 달라집니다. 그래서 만약 그가'foreach (int i in q) {if (i> = 10) break; Console.WriteLine (i); }', 그것은 단지 10 번만 얻을 것이다. –
@Jaroslav : ** 호출 코드 **는 실제로 반복을 중지해야하지만, 반복자는 스스로를 멈출 수 없습니다. 그것이 내 요점이었습니다. 반복기는 호출 코드가 1에서 10까지만 반복하기를 원한다는 것을 본질적으로 알지 못합니다. – jrista
나는 동의합니다. 나는 무엇이 일어나고 있는지 자세히 설명하고 싶습니다. 당신의 대답에서 명확하지 않은 결과가 있습니다. 귀하의 의견은 원래 답변 (IMHO)보다 명확합니다. –