イテレーターの挙動

void Main()
{
	foreach (var element in FromTo(10,20))
	{
		Console.WriteLine("element:" + element);
	}
}

static public IEnumerable<int> FromTo(int from,int to)
{
	Console.WriteLine("FromToStart");
	while (from <= to)
	{
		Console.WriteLine("From:{0}, To:{1}",from,to);
	 	yield return from++;
	}
}


出力結果

FromToStart
From:10, To:20
element:10
From:11, To:20
element:11
From:12, To:20
element:12
From:13, To:20
element:13
From:14, To:20
element:14
From:15, To:20
element:15
From:16, To:20
element:16
From:17, To:20
element:17
From:18, To:20
element:18
From:19, To:20
element:19
From:20, To:20
element:20



次にFromToメソッドをこんな感じに変えると

static public IEnumerable<int> FromTo(int from,int to)
{
	Console.WriteLine("FromToStart");
	while (from <= to)
	{
		Console.WriteLine("From:{0}, To:{1}",from,to);
		
		if(from >= 15)
			yield break;
		
		yield return from++;
	}
}

出力結果はこうなる。
ポイントはbreakでforeachを抜けているので、Console.Write("element~)は実行されていない

FromToStart
From:10, To:20
element:12
From:12, To:21
element:14
From:14, To:22
element:16
From:16, To:23
element:18
From:18, To:24