1. ホーム
  2. c#

[解決済み] Resharperのサンプルコードで「IEnumerableの複数列挙の可能性」を説明する。

2023-07-16 05:10:02

質問

Resharperが警告を出すことがあります。

IEnumerableの複数列挙の可能性

そこに この問題をどのように扱うかについてのSO質問 また、ReSharper のサイトでは はこちら . 代わりにこうしろというサンプルコードもあります。

IEnumerable<string> names = GetNames().ToList();

2つのfor-eachループで2回コレクションを列挙することになりませんか?

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

GetNames()IEnumerable . ですから、その結果を保存すると

IEnumerable foo = GetNames();

そうすると、列挙するたびに foo を列挙するたびに、その GetNames() メソッドが再び呼び出されます (文字通りの意味ではなく、詳細をきちんと説明しているリンクが見つかりませんが IEnumerable.GetEnumerator() ).

これを見たResharperは 結果 を列挙して GetNames() をローカル変数で、例えばリストで実体化することによって列挙します。

IEnumerable fooEnumerated = GetNames().ToList();

これによって GetNames() の結果が一度だけ列挙されるようにします。 fooEnumerated .

これは重要なことで、例えば GetNames() が(遅い)データベース呼び出しを実行するときなどです。

なぜなら、あなたは マテリアライズ を列挙することはもう問題ではありません。 fooEnumerated を2回列挙することはもう問題ではなく、メモリ内のリストに対して2回反復することになります。