反復処理の実装とyield文

プログラミングC# 第6版 7.3.1.1


反復処理を独自に実装することが可能とのこと。

これは説明が難しいので実装を見た方がわかりやすいかと思います。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        foreach(int i in Foo()){
            Console.WriteLine(i);
        }
    }
    
    static IEnumerable<int> Foo () {
        yield return 1;
        yield return 3;
        yield return 6;
    }
}
$ main
1
3
6

Foo関数の戻り値がIEnumerable型というものになっています。

これでforeachで評価することができるようになります。

そして通常のreturnではなく、yield returnというものになっています。

Fooが呼ばれるたびにyieldの位置まで処理が進み、次のループに入るときに、前回進んだyieldの位置から処理が再開されるという処理になっています。

またFooの戻り値を一時変数に保持し、whileループで処理させることもできます。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        IEnumerable<int> foo = Foo(); 
        IEnumerator<int> iter = foo.GetEnumerator();
        
        while ( iter.MoveNext() ) {
            Console.WriteLine(iter.Current);
        }
    }
    
    static IEnumerable<int> Foo () {
        yield return 1;
        yield return 3;
        yield return 6;
    }
}

色々と活用できそうですね。今後使えるケースがあれば使ってみたいと思います。