2

重複の可能性:
歩留まりリターンの適切な使用

yieldC#でのキーワードの使用は何ですか?

私はMSDNリファレンスからそれを理解していませんでした...誰かが私にそれを説明してもらえますか?

4

2 に答える 2

8

例を挙げてみます

これが古典的な方法で、リストオブジェクトを埋めて、それを返します。

private IEnumerable<int> GetNumbers()
{
    var list = new List<int>();
    for (var i = 0; i < 10; i++)
    {
        list.Add(i);
    }
    return list;
}

yieldキーワードは、次のようにアイテムを1つずつ返します。

private IEnumerable<int> GetNumbers()
{
    for (var i = 0; i < 10; i++)
    {
        yield return i;
    }
}

したがって、GetNumbers関数を呼び出すコードを次のように想像してください。

foreach (int number in GetNumbers())
{
   if (number == 5)
   {
       //do something special...
       break;
   }
}

イールドを使用しない場合は、0から10までのリスト全体を生成する必要があります。このリストが返され、5という数字が見つかるまで繰り返されます。

これで、yieldキーワードのおかげで、探しているものに到達してループを抜けるまで、数字を生成するだけです。

私が十分に明確であったかどうかはわかりません。

于 2012-06-29T23:36:16.253 に答える
0

私の質問は、いつそれを使うのかということです。歩留まりを使用する以外に選択肢がない例はありますか?なぜ誰かがC#に別のキーワードが必要だと感じたのですか?

あなたがリンクした記事は、それがいつどのように使われるかについての良い例を提供しました。

あなた自身がリンクした記事を引用するのは嫌いですが、長すぎてあなたが読んでいない場合に備えて。

yieldキーワードは、それが表示されるメソッドがイテレーターブロックであることをコンパイラーに通知します。コンパイラーは、イテレーター・ブロックで表現される動作を実装するためのクラスを生成します。

public static System.Collections.IEnumerable Power(int number, int exponent)
{
    int counter = 0;
    int result = 1;
    while (counter++ < exponent)
    {
        result = result * number;
        yield return result;
    }
}

上記の例では、yieldステートメントはイテレータブロック内で使用されています。Powerメソッドが呼び出されると、数値の累乗を含む列挙可能なオブジェクトが返されます。Powerメソッドの戻りタイプがSystem.Collections.IEnumerableであり、イテレーターインターフェイスタイプであることに注意してください。

そのため、コンパイラは、メソッドの実行中に生成されたものに基づいて、インターフェイスされたIEnumerableを自動的に生成します。

完全を期すために、簡単な例を次に示します。

public static System.Collections.IEnumerable CountToTen()
{
    int counter = 0;
    while (counter++ < 10)
    {
        yield return counter;
    }
}

public static Main(string[]...)
{
    foreach(var i in CountToTen())
    {
        Console.WriteLine(i);
    }
}
于 2012-06-29T23:36:46.080 に答える