コレクションの定義
コレクションとは、似たような型が指定されている複数のオブジェクトを 1 つのグループにまとめたものです。
任意の型の複数のオブジェクトを Object 型の単一のコレクションにグループ化することにより、使用言語に固有の構造を有効利用できます。 たとえば、C# の foreach ステートメント (Visual Basic では for each) では、コレクション内のすべてのオブジェクトが単一の型であることが要求されます。
しかし、Object 型のコレクションでは、ボックス化やボックス化解除、変換などの追加処理が各要素に対して個別に実行されるため、コレクションのパフォーマンスに影響します。 通常は、Object 型のコレクションに値型を格納するとき、または Object 型のコレクションから値型を取得するときにボックス化とボックス化解除が行われます。
List<T> などのジェネリック コレクションと、StringCollection などの厳密に型指定された非ジェネリック コレクションでは、たとえば StringCollection に対して文字列の格納や取得を行うなど、要素の型がコレクションの意図する型である場合には、このようなパフォーマンスへの影響を回避できます。 さらに、厳密に型指定されたコレクションでは、そのコレクションに追加された各要素の型が自動的に検証されます。 以上の理由から、可能であればジェネリック コレクション クラスを使用することを強くお勧めします。
ICollection インターフェイスまたは ICollection<T> ジェネリック インターフェイスを直接または間接的に実装するすべてのコレクションは、要素を追加、削除、または検索するメソッドの他に、次の機能を共有します。
列挙子 :
列挙子は、関連付けられたコレクションを反復処理するオブジェクトです。 列挙子は、コレクション内にある任意の要素を指す、移動可能なポインターと考えることができます。 列挙子は 1 つのコレクションにしか関連付けることができませんが、コレクションには複数の列挙子を関連付けることができます。 C# の foreach ステートメント (Visual Basic では for each) は列挙子を使用していますが、その列挙子の複雑な操作は内部で行われます。
同期メンバー (System.Collections クラスのみ)
System.Collections 名前空間のレガシ コレクション型では、同期により、コレクションの要素にアクセスするときのスレッド セーフがある程度実現されます。 既定では、コレクションはスレッド セーフではありません。 スケーラブルで効率的なコレクションへのマルチスレッド アクセスが必要な場合は、System.Collections.Concurrent 名前空間のいずれかのクラスを使用します。 詳細については、「スレッド セーフなコレクション」を参照してください。
System.Collections 名前空間の少数のクラスにだけ、コレクションの外側にスレッド セーフなラッパーを作成する Synchronize メソッドが用意されています。 ただし、すべての System.Collections 名前空間のすべてのクラスには、スレッド セーフな独自のラッパーを作成するために派生クラスで使用できる SyncRoot プロパティがあります。 また、コレクションがスレッド セーフかどうかを判断するための IsSynchronized プロパティもあります。 同期は、ICollection<T> ジェネリック インターフェイスでは使用できません。
CopyTo メソッド:
すべてのコレクションを CopyTo メソッドを使用して配列にコピーできますが、新しい配列内での要素の順序は、列挙子がそれらの要素を返す順序に基づきます。 コピー後の配列は、常に下限が 0 の 1 次元配列になります。
ICollection<T> ジェネリック インターフェイスには、非ジェネリック インターフェイスには含まれていないメンバーが追加で含まれています。
System.Collections 名前空間の一部のクラスには、次の機能が実装されています。
容量とカウント :
コレクションの容量とは、コレクションに含めることのできる要素の数です。 また、コレクションのカウントは、コレクションが実際に含んでいる要素の数です。 BitArray は特別な入れ物で、容量が長さと等しく、長さがカウントと等しくなっています。 コレクションによっては、容量またはカウント、あるいはその両方を内部で処理する場合があります。
どのコレクションも、現在の容量がいっぱいになると、容量が自動的に拡張されます。 このとき、メモリが再割り当てされ、要素が古いコレクションから新しいコレクションにコピーされます。 これにより、コレクションを使用するために必要なコードは減りますが、コレクションのパフォーマンスに悪影響が及ぶ可能性があります。 再割り当てが繰り返し実行されることによるパフォーマンスの低下を防ぐには、コレクションのサイズとして想定される容量を初期容量として設定しておくのが最善の方法です。
下限 :
コレクションの下限とは、コレクション内の最初の要素のインデックスです。 System.Collections 名前空間内のどのインデックス付きコレクションも、下限は 0 です。 Array も既定で下限は 0 ですが、CreateInstance を使用して Array クラスのインスタンスを作成する際に、別の下限を定義できます。
System.Collections クラスは、一般に、次の 3 種類に分類できます。
一般的に使用されるコレクション :
ハッシュ テーブル、キュー、スタック、ディクショナリ、リストなど、一般的な種類のデータ コレクションです。 一般的に使用されるコレクションの多くには、非ジェネリック バージョン、ジェネリック バージョン、およびスレッド セーフ ジェネリック バージョンがあります。
ビット コレクション :
要素がビット フラグであるコレクションです。 ビット コレクションの動作は、ほかのコレクションとは少し異なります。
専用コレクション :
固有の目的を持つコレクションであり、通常は、StringDictionary などの固有の型の要素を処理することを目的とします。
コレクション クラスは、慎重に選択してください。 各コレクションには独自の機能があるため、それぞれに固有の制限もあります。 より専用化されたコレクションほど、制限も多くなります。 コレクションを選択するときのヒントについては、「コレクション クラスの選択」を参照してください。
参照
参照
System.Collections.Specialized