[解決済み] C#でyield returnイテレータを使用する目的/利点は何ですか?
質問
私が見たすべての
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万より小さい数を表示するように簡単に変更できます。この例では、シーケンスが無限大で、消費者は最初からいくつ欲しいのかさえ分からないので、すべての素数のリストを返すことはできません。
関連
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] イールドリターン」の正しい使い方
-
[解決済み】C#のyieldキーワードは何に使われるのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない