[解決済み] イールドリターン」の正しい使い方
2022-03-20 09:25:13
質問
その 降伏 キーワードは、そのうちの1つ キーワード を正しく使えているのか、自信がありません。
次の2つのコードのうち、どちらが好ましいか、またその理由は?
バージョン1: イールドリターンを使用する
public static IEnumerable<Product> GetAllProducts()
{
using (AdventureWorksEntities db = new AdventureWorksEntities())
{
var products = from product in db.Product
select product;
foreach (Product product in products)
{
yield return product;
}
}
}
バージョン2です。 リストを返す
public static IEnumerable<Product> GetAllProducts()
{
using (AdventureWorksEntities db = new AdventureWorksEntities())
{
var products = from product in db.Product
select product;
return products.ToList<Product>();
}
}
解決方法は?
リストの次の項目(あるいは次のグループの項目)を計算するとき、イールドリターンを使うことが多いのですが、どうしたらいいですか?
あなたのバージョン2を使用すると、戻る前に完全なリストを持っている必要があります。 しかし、Yield-returnを使用すれば、次の項目さえあればよいことになります。
特に、複雑な計算の計算コストをより大きな時間枠に分散させることができるようになります。 例えば、リストがGUIにフックされている場合、ユーザーが最後のページに行くことがなければ、リストの最後の項目を計算することはありません。
また、IEnumerableが無限集合を表す場合にもyield-returnが望ましいと言えます。 素数のリストや乱数の無限リストを考えてみましょう。 IEnumerable の全機能を一度に返すことはできないので、yield-return を使ってリストを少しずつ返していくのです。
この例では、製品の完全なリストを持っているので、バージョン2を使用します。
関連
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】C#のyieldキーワードは何に使われるのか?
-
[解決済み】JavaScriptの "function*"とは何ですか?