佐々木屋

技術的なことから趣味まで色々書きます

イテレーターの基本

メソッドの戻り値やgetterプロパティでreturnではなくyield returnした構文のことをイテレーター(メソッド)と呼びます。イテレーターの概念はRubyPythonC#とほぼ同様です。なお、yieldはイールドと呼びます。

イテレーターの概念は現在のオブジェクト指向プログラミングで無くてはならないLINQラムダ式の概念につながっていきますので、是非勉強してみて下さい。


以下のように簡単な配列を返す処理を考えてみます。

private List<string> Naiyo() {
    List<string> res = new List<string>();
    res.Add("hoge");
    res.Add("piyo");
    res.Add("fuga");
    return res;
}

foreach (var n in Naiyo()) {
    Console.WriteLine(n);
}
Private Function Naiyo() As List(Of String)
    Dim res As New List(Of String)
    res.Add("hoge")
    res.Add("piyo")
    res.Add("fuga")
    Return res
End Function

For Each n As String In Naiyo()
    Console.WriteLine(n)
Next
hoge
piyo
fuga



さて、これをイテレーターにするとどうなるでしょうか。(呼び出し方法は変わりありませんので、これ以降は省略します。)

イテレーターの条件の一つとして、IEnumerableインタフェースを返すオブジェクトである必要があります。C#はreturn の代わりにyield returnを使用します。

private IEnumerable<string> Naiyo() {
    yield return "hoge";
    yield return "piyo";
    yield return "fuga";
}

VB.NETIteratorキーワードをつけて、Returnの代わりにYieldを使用します。

Private Iterator Function Naiyo() As IEnumerable(Of String)
    Yield "hoge"
    Yield "piyo"
    Yield "fuga"
End Function
hoge
piyo
fuga

見事に同じ結果になってしまいました。但し、前者は配列をそのまま返しているのですが、後者はforeachで配列の数だけNaiyoメソッドが呼ばれています。
ブレークポイントを設定して処理を一つ一つ確認してみて下さい。


イテレーターが果たす役割は現時点ではよく分からないと思いますが、今回は書き方と挙動を理解して下さい。