イテレーターの基本
メソッドの戻り値やgetterプロパティでreturnではなくyield returnした構文のことをイテレーター(メソッド)と呼びます。イテレーターの概念はRubyやPythonもC#とほぼ同様です。なお、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
private IEnumerable<string> Naiyo() { yield return "hoge"; yield return "piyo"; yield return "fuga"; }
VB.NETはIteratorキーワードをつけて、Returnの代わりにYieldを使用します。
Private Iterator Function Naiyo() As IEnumerable(Of String) Yield "hoge" Yield "piyo" Yield "fuga" End Function
hoge piyo fuga
見事に同じ結果になってしまいました。但し、前者は配列をそのまま返しているのですが、後者はforeachで配列の数だけNaiyoメソッドが呼ばれています。
ブレークポイントを設定して処理を一つ一つ確認してみて下さい。
イテレーターが果たす役割は現時点ではよく分からないと思いますが、今回は書き方と挙動を理解して下さい。