[解決済み] yield return で全ての列挙体をループさせることなく一度に返す。
2022-04-20 14:48:24
質問
カードのバリデーションエラーを取得するために、以下のような関数を用意しました。 質問は、GetErrorsの処理に関するものです。 どちらのメソッドも同じ戻り値型を持っています。
IEnumerable<ErrorInfo>
.
private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
var errors = GetMoreErrors(card);
foreach (var e in errors)
yield return e;
// further yield returns for more validation errors
}
のエラーをすべて返すことは可能ですか?
GetMoreErrors
列挙する必要はないのですか?
どのように解決するのですか?
これは決してバカげた質問ではないし、F#がサポートする
yield!
コレクション全体に対して
yield
を1つの項目に対して使用します。(末尾再帰の観点からは非常に便利なのですが...)
残念ながらC#ではサポートされていません。
しかし、複数のメソッドがあり、それぞれが
IEnumerable<ErrorInfo>
を使用することができます。
Enumerable.Concat
を使えば、よりシンプルなコードになります。
private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
return GetMoreErrors(card).Concat(GetOtherErrors())
.Concat(GetValidationErrors())
.Concat(AnyMoreErrors())
.Concat(ICantBelieveHowManyErrorsYouHave());
}
しかし、この2つの実装には非常に重要な違いが1つあります。それは、この実装ではすべてのメソッド
すぐに
しかし、返されたイテレータを一度に1つずつしか使用しません。既存のコードでは、このように
GetMoreErrors()
を実行する前に
が尋ねる。
次のエラーについて
通常、これは重要ではありませんが、いつ何が起こるかを理解しておくことは価値があります。
関連
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み] 2つのリストを結合する
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み] イールドリターン」の正しい使い方
-
[解決済み】yield returnを使ったIEnumerableとRecursionについて
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない