IEnumerable の複数列挙の危険性への対処
IEnumerable コレクションを使用する場合、開発者はよく「IEnumerable が複数列挙される可能性がある」という警告に遭遇します。 」という問題が発生します。これは、コレクションが複数回反復されるときに発生します。この問題は、データベース クエリやその他の負荷の高い操作を表すコレクションなど、特定の種類のコレクションを操作する場合に特に問題となる可能性があります。
次のコード スニペットを検討してください。
public List<object> Foo(IEnumerable<object> objects) { if (objects == null || !objects.Any()) throw new ArgumentException(); var firstObject = objects.First(); var list = DoSomeThing(firstObject); var secondList = DoSomeThingElse(objects); list.AddRange(secondList); return list; }
1 つの方法複数列挙の警告を回避するには、List
別のオプションは、メソッドの先頭で IEnumerable を List に変換することです。
public List<object> Foo(IEnumerable<object> objects) { var objectList = objects.ToList(); // ... }
このテクニックは警告を防ぐのに効果的ですが、ぎこちなく、不必要に冗長に感じる可能性があります。
この問題を理解するには、メソッド シグネチャによって伝えられるセマンティクスにあります。 IEnumerable パラメーターを渡すことは、呼び出し元がメソッドがコレクションを 1 回だけ列挙することを予期していることを意味します。 IList または ICollection を受け入れることで、コレクションに対する期待を呼び出し元に明示的に伝え、誤解や損害の大きい間違いのリスクを軽減します。
IEnumerable の使用が不可欠な状況では、ToList( ) メソッドの先頭で変換します。これにより、後続の反復で複数列挙の警告が発生しなくなります。
残念ながら、.NET では、追加メソッドや削除メソッドを使用せずに IEnumerable、Count、およびインデクサーの機能をカプセル化するインターフェイスが提供されていません。このようなインターフェースは、この問題を大幅に単純化し、よりクリーンで簡潔な解決策を提供します。
以上がC# で「IEnumerable が複数列挙される可能性があります」という警告を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。