C# の yield の使い方
C# の yield return の使い方
yield キーワードを使うと、テンポラリのコレクションを作成することなく、メソッドでコレクションを返すことができます。
この場合、IEnumerable<T> (T は型) を戻り値の型に設定します。
そして yield return を呼ぶと、その戻り値をいわば暗黙的なコレクションに保存していき、メソッドを抜けるときにコレクションとして結果を返します。
具体例をみてください。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
var states = new List();
states.Add("California");
states.Add("Hawaii");
states.Add("Connecticut");
states.Add("Texas");
var i = FilterState(states, "C");
foreach (var m in i)
{
Console.WriteLine(m);
}
}
static IEnumerable FilterState(
List states,
string filter)
{
foreach (var s in states)
{
if (s.StartsWith(filter))
{
yield return s;
}
}
}
}
この結果はつぎのようになります。
California
Connecticut
カリフォルニア (California) とコネチカット (Connecticut) は C から始まるので、ここで定義したメソッド FilterState でフィルターされ、 呼び出し元に返されていることがわかります。
このように yield return を使うと、明示的に一時的なコレクションを作成する必要がなくなります。
C# の yield break を使う場合
C# には yield break 文というのもあります。yield break 文の使い方を具体例で説明します。
次の Foo() メソッドでは yield return を利用して、 string 型のコレクションを返しています。
static IEnumerable Foo()
{
yield return "A";
yield return "B";
yield return "C";
}
さて、このメソッドの途中で、なんらかの理由でメソッドを抜けたい場合はどうしたら良いでしょうか。
通常、メソッドを抜ける場合には return 文を記述します。
しかし、このメソッドでは yield return でコレクションを返しているところなので、 yield をつけない return 文を書くことができません。
yield return を用いている場合には、 単純な return 文ではなく yield break 文を使ってメソッドから抜けることができます。
static IEnumerable Foo()
{
yield return "A";
yield return "B";
if ((new Random()).Next() % 2 == 0)
{
yield break;
}
yield return "C";
}
ここでは乱数を生成し,その乱数の 2 の剰余が 0 のときに yield break でメソッドを抜けています。