[C#] yield


yield

yieldキーワードは、호출자(Caller)にセットデータを1つずつ返すために使用される.これらの一般的にEnumerator(Iterator)と呼ばれる機能は、
集合したデータセットから,呼び出し者にデータを1つずつ送信する.

使用方法

yieldは、2つの方法の生産量リターンまたは生産量突破に使用することができる.
  • (1)yield return:集合データを1つずつ返すための
  • .
  • (2)yield break:リターンを停止するサイドリングを脱退する際に
  • を使用する.

    using System;
    using System.Collections.Generic;
    
    class Program
    {
        static IEnumerable<int> GetNumber()
        {
            yield return 10;  // 첫번째 루프에서 리턴되는 값
            yield return 20;  // 두번째 루프에서 리턴되는 값
            yield return 30;  // 세번째 루프에서 리턴되는 값
        }
    
        static void Main(string[] args)
        {
            foreach (int num in GetNumber())
            {
                Console.WriteLine(num);
            }             
        }
    }
    
    GetNumber()この方法には3つの収益率がある.
    このGetNumber()を外部から呼び出すと、
    最初の呼び出しは、最初のyield return 10を実行し、10を返します.
    2回目の呼び出しの場合、yield return 20が実行され、20が返されます.
    このようにしてGetNumber()は10,20,30を同時に返すものではない.
    呼び出すたびに、次のreturn文の値が返されます.

    使用例


    この特殊な戻り方は、次の場合に便利です.
    (1)データ量が大きすぎる場合は,一度にすべてのデータを返すのが一度に返すよりも有効である.
    いくつかの検索では、1万個のデータがあります.
    UIに10個のOnDemandしか表示されない方が良いかもしれません.
    つまり,ユーザは20個,あるいは1000個が欲しいかもしれない.지연 실행(Lazy Operation)を実行したほうがいいかもしれません.
    (2)メソッドが無制限のデータを返す場合.
    ランダムな数値を無制限に連続的に返す関数は、最終的にリスト全体を返すことができないため、収益率を使用して実現されます.
    (3)すべてのデータを予め計算しておくと速度が遅くなり、その際に必要に応じて処理することが望ましい.
    「小数」(Prime Number)を返し続ける関数です.
    小数点以下しか取得していない場合(もちろん、これも無制限のデータです)
    計算時間が長いため、次の少数を返す関数を作成するだけです.
    遅延計算(Lazy Calculation)を実現し、所要時間を短縮することができる.

    生産高とクライアント

    yieldでよく用いられる場所は、集約データを有する集合クラスである.
    通常、集合クラスは、1つのデータ要素を使用するために、Enumerator(Iterator)を実施する.Enumeratorを実現する方法の1つとして、yield を使用することができる.GetEnumerator()メソッドは、集合タイプまたはEnummerableクラスにおいて実装される方法の1つであり、yieldを使用することができる.
    すなわち、GetEnumerator()の方法ではyield returnが用いられる.
    集合データを順番に渡すコードを実装する.
    戻りタイプでIE分子界面を返すことができる.
    C#でIvalenter方式yieldを使用すると、
    追加のEnumeratorクラスを明示的に記述する必要はありません.


    次の例は、セットタイプMyListのデータを1つずつ返すGetEnumerator()メソッドの例コードである.
    一例のGetEnumerator()メソッドのデータを返します.yield returnゲートはwhileリング内で使用されます.
    クラスのサンプルデータは1~5の数値で、外部呼び出し者が順次呼び出す場合yield returnから順番に戻ります.
    △ex.まず1、それから2、それから3です.호출자(Caller)このメソッドの使用方法
    (1)foreach 문を用いてC#で自動的に奇形腫環処理を行う方法
    (2)GetEnumerator()からIE分子インタフェースを取得し,MoveNext()法とCurrent特性を用いて,開発者が1つの要素を手動で使用した.
    その利便性のため、(1)番方式が一般的である.
    次の例の下部は次のとおりです.
    (1)foreach문の使用方法
    (2)IEのメンバを用いて手動でEnumerationを行う方法を例示する.
    using System;
    using System.Collections;
    
    public class MyList
    {
        private int[] data = { 1, 2, 3, 4, 5 };
        
        public IEnumerator GetEnumerator()
        {
            int i = 0;
            while (i < data.Length)
            {
                yield return data[i];
                i++;                
            }
        }
    
        //...
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            // (1) foreach 사용하여 Iteration
            var list = new MyList();
    
            foreach (var item in list)  
            {
                Console.WriteLine(item);
            }
    
            // (2) 수동 Iteration
            IEnumerator it = list.GetEnumerator();
            it.MoveNext();
            Console.WriteLine(it.Current);  // 1
            it.MoveNext();
            Console.WriteLine(it.Current);  // 2
        }
    }
    

    生産高実行順序


    C#呼び出し元呼び出しは、yieldの反復メソッドを有する.
    実行方法は次のとおりです.
    すなわち、호출자(A)が戻り可数の메서드(B)を呼び出すと、yield returnゲートから値が返され、메서드(B)の位置が記憶されます.호출자(A)がループを返し、메서드(B)に次の値を要求した場合.
    メソッドの記憶位置は、次の文から実行され、次のyield 문に遭遇し、値を返す.

    💡 注意:配置


    [例学習C#プログラミング]基本構文-C#yield