1. ホーム
  2. c#

[解決済み] C#でyield returnイテレータを使用する目的/利点は何ですか?

2023-06-22 08:11:29

質問

私が見たすべての yield return x; を使用するすべての例は、リスト全体を返すことによって同じように行うことができます。このような場合に yield return 構文とリストを返すことの利点は何ですか?

また、どのようなシナリオで yield return はどのような場面で使われ、完全なリストを返すことができないのでしょうか?

どのように解決するのですか?

しかし、自分でコレクションを作る場合はどうでしょうか?

一般に、イテレータは次のような用途に使われます。 オブジェクトの列を遅延して生成する . 例えば Enumerable.Range メソッドは内部的にどんな種類のコレクションも持っていません。それは単に次の数字を生成するだけです。 オンデマンドで . ステートマシンを使ったこの遅延シーケンス生成には多くの使い道があります。そのほとんどは 関数型プログラミングの概念 .

私の意見では、もしあなたがイテレータを単にコレクションを列挙する方法として見ているなら(これは最も単純な使用例の1つです)、間違った方向に進んでいると思います。イテレータはシーケンスを返すための手段なのです。シーケンスは 無限 . 無限の長さを持つリストを返して、最初の100項目を使用する方法はないでしょう。それは を持っています。 は時々怠けるために コレクションを返すのと、コレクションジェネレータを返すのではかなり違う (イテレータがそうであるように)。リンゴとオレンジを比較しているようなものです。

仮の例です。

static IEnumerable<int> GetPrimeNumbers() {
   for (int num = 2; ; ++num) 
       if (IsPrime(num))
           yield return num;
}

static void Main() { 
   foreach (var i in GetPrimeNumbers()) 
       if (i < 10000)
           Console.WriteLine(i);
       else
           break;
}

この例では10000未満の素数を表示しています。素数生成アルゴリズムに全く手を加えることなく、100万より小さい数を表示するように簡単に変更できます。この例では、シーケンスが無限大で、消費者は最初からいくつ欲しいのかさえ分からないので、すべての素数のリストを返すことはできません。