イテレーターの挙動
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