[C#] yield
yield
yield
キーワードは、호출자(Caller)
にセットデータを1つずつ返すために使用される.これらの一般的にEnumerator(Iterator)
と呼ばれる機能は、集合したデータセットから,呼び出し者にデータを1つずつ送信する.
使用方法
yield
は、2つの方法の生産量リターンまたは生産量突破に使用することができる.yield return
:集合データを1つずつ返すための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
Reference
この問題について([C#] yield), 我々は、より多くの情報をここで見つけました https://velog.io/@youhyeoneee/C-yieldテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol