.NET 4.5
- Materialization.IEnumerable<T>
コレクションが既に使用可能 ("具体化" されている) かどうか、または (コレクションが LINQ クエリを表す場合など) コレクションが反復処理されるたびに計算されるかどうかを表現することを許可しません。アルゴリズムで、コレクションを複数回反復処理しなければならないときにシーケンス計算の負荷が高いと、この表現によってパフォーマンスが低下することがあります。また、以降の処理でオブジェクトが再生成されるときの ID の不一致が原因で小さなバグを誘発することもあります。
- Count.IEnumerable<T>
カウントを提供しません。実際、無限シーケンスになる可能性もあるため、1 つも保有しない場合もあります。ただし、ほとんどの場合、Enumerable.Count という静的拡張メソッドで十分です。このメソッドはシーケンス全体を反復処理することを避けるために ICollection<T> などの既知のコレクション型を特別扱いするという理由が 1 つ、結果の計算の負荷が高くない場合が多いという理由が 2 つです。ですが、コレクションのサイズによっては、Count.IEnumerable<T> の方が適切な場合もあります。
- Indexing.IEnumerable<T>
項目へのランダム アクセスを許可しません。クイック ソートなどのアルゴリズムの中には、インデックスを使って項目にアクセスできることに依存するものもあります。この場合も、特定の Enumerable の後に IList<T> が付いている場合に最適化されたコード パスを使用する静的な拡張メソッド (Enumerable.ElementAt) があります。ただし、インデックス処理をループ内で使用している場合、線形走査がパフォーマンスに深刻な影響を与える場合があります。線形走査は、優れた O(n) アルゴリズムを O(n2) アルゴリズムに変えてしまうためです。そのため、ランダム アクセスを使おうとするときは、本当に必要かどうか考えてみてください。
読み取り専用コレクションの異なる概念 †
- 変更可能 (または読み取り専用ではない):
.NET で最もよく使われるコレクション型です。項目の読み取り、追加、削除、変更を可能にする List<T> などのコレクションです。
- 読み取り専用:
外部からは変更できないコレクションです。ただし、このコレクションの概念は、コンテンツが決して変わらないことを保証するものではありません。たとえば、ディクショナリのキーと値のコレクションは、直接更新できませんが、ディクショナリに追加すると、キーと値のコレクションが間接的に更新されます。
- 変更不可:
作成後は、決して変更されないことが保証されるコレクションです。これは、マルチスレッドに適したプロパティです。複雑なデータ構造が完全に変更不可であれば、バックグラウンド ワーカーに常に安全に渡すことができます。だれかによって同時に変更される可能性について心配する必要はありません。このコレクション型は、現在 Microsoft .NET Framework 基本クラス ライブラリ (BCL) では提供されません。
- Freezable:
このコレクションは、固定されるまで、変更可能なコレクションのように動作します。その後は、変更不可のコレクションのように動作します。BCL はこれらのコレクションを定義しませんが、Windows Presentation Foundation で見つけることができます。
本当にほしかったのはこういうブログだったんだ
コメント:
|