コレクション クラスの選択
コレクション クラスは慎重に選択してください。 間違った型を使用すると、コレクションの使用が制限されることがあります。
重要
名前空間 System.Collections の型は使わないでください。 タイプ セーフの強化やその他の改善があるため、ジェネリックおよび同時実行バージョンのコレクションをお勧めします。
以下の質問を検討します。
値が取得された後に要素が通常は破棄されるシーケンシャル リストが必要ですか。
そうである場合は、先入れ先出し (FIFO) の動作が必要であれば、Queue クラスまたは Queue<T> ジェネリック クラスの使用を検討してください。 後入れ先出し (LIFO) の動作が必要であれば、Stack クラスまたは Stack<T> ジェネリック クラスの使用を検討します。 複数のスレッドから安全にアクセスできるように、同時実行バージョンの ConcurrentQueue<T> と ConcurrentStack<T> を使用します。 不変にしたい場合は、不変バージョン、ImmutableQueue<T> および ImmutableStack<T> を検討してください。
それ以外の場合は、その他のコレクションの使用を検討してください。
FIFO や LIFO など特定の順序で要素にアクセスする必要がありますか。またはランダムにアクセスできますか。
Queue クラス、Queue<T>、ConcurrentQueue<T>、および ImmutableQueue<T> ジェネリック クラスはすべて、FIFO アクセスを提供します。 詳細については、「スレッド セーフなコレクションを使用する状況」をご覧ください。
Stack クラス、Stack<T>、ConcurrentStack<T>、および ImmutableStack<T> ジェネリック クラスはすべて、LIFO アクセスを提供します。 詳細については、「スレッド セーフなコレクションを使用する状況」をご覧ください。
LinkedList<T> ジェネリック クラスは、先頭から末尾または末尾から先頭への順次アクセスを可能にします。
インデックスで各要素にアクセスする必要があるでしょうか。
ArrayList と StringCollection クラス、および List<T> ジェネリック クラスは、要素の 0 から始まるインデックスによってその要素へのアクセスを提供します。 不変にしたい場合は、不変ジェネリック バージョン、ImmutableArray<T> および ImmutableList<T> を検討してください。
Hashtable、SortedList、ListDictionary、StringDictionary クラス、および Dictionary<TKey,TValue>、SortedDictionary<TKey,TValue> ジェネリック クラスは、要素のキーによってその要素へのアクセスを提供します。 また、いくつかの対応する型に、ImmutableHashSet<T>、ImmutableDictionary<TKey,TValue>、ImmutableSortedSet<T>、および ImmutableSortedDictionary<TKey,TValue> の不変バージョンがあります。
NameObjectCollectionBase と NameValueCollection クラス、および KeyedCollection<TKey,TItem> と SortedList<TKey,TValue> ジェネリック クラスは、要素の 0 から始まるインデックスまたはキーのいずれかによって、その要素へのアクセスを提供します。
各要素に含まれることになるのは、1 つの値、1 つのキーと 1 つの値の組み合わせ、または 1 つのキーと複数の値の組み合わせのどれですか。
1 つの値: IList インターフェイスまたは IList<T> ジェネリック インターフェイスに基づくいずれかのコレクションを使用します。 不変のオプションについては、IImmutableList<T> ジェネリック インターフェイスを検討してください。
1 つのキーと 1 つの値: IDictionary インターフェイスまたは IDictionary<TKey,TValue> ジェネリック インターフェイスに基づくいずれかのコレクションを使用します。 不変のオプションについては、IImmutableSet<T> または IImmutableDictionary<TKey,TValue> のジェネリック インターフェイスを検討してください。
キーが埋め込まれた 1 つの値: KeyedCollection<TKey,TItem> ジェネリック クラスを使用します。
複数の値を持つ 1 つのキー: NameValueCollection クラスを使用します。
要素を入力されたときとは異なる方法で並べ替える必要がありますか。
Hashtable クラスは、ハッシュ コードによってその要素を並べ替えます。
SortedList クラスと、SortedList<TKey,TValue> および SortedDictionary<TKey,TValue> ジェネリック クラスでは、キーによってその要素を並べ替えます。 並べ替え順序は、SortedList クラスの IComparer インターフェイスの実装と、SortedList<TKey,TValue> および SortedDictionary<TKey,TValue> ジェネリック クラスの IComparer<T> ジェネリック インターフェイスの実装に基づきます。 この 2 つのジェネリック型のうち、SortedDictionary<TKey,TValue> は SortedList<TKey,TValue> よりもパフォーマンスに優れていますが、メモリ消費は SortedList<TKey,TValue> の方が少なくなります。
ArrayList は、IComparer 実装をパラメーターとして受け取る、Sort メソッドを提供します。 それに対応するジェネリックである List<T> ジェネリック クラスは、IComparer<T> ジェネリック インターフェイスの実装をパラメーターとして受け取る、Sort メソッドを提供します。
高速な検索と情報の取得が必要ですか。
- ListDictionary は、小規模なコレクション (10 個以下のアイテム) では Hashtable より高速です。 Dictionary<TKey,TValue> ジェネリック クラスは、SortedDictionary<TKey,TValue> ジェネリック クラスよりも高速の参照を提供します。 マルチスレッドの実装は ConcurrentDictionary<TKey,TValue> です。 ConcurrentBag<T> は、順序指定されていないデータのために、高速なマルチスレッドの挿入を提供します。 両方のマルチスレッドのタイプについては、「スレッド セーフなコレクションを使用する状況」を参照してください。
文字列だけを受け入れるコレクションは必要ですか。
StringCollection (IList に基づく) および StringDictionary (IDictionary に基づく) は、System.Collections.Specialized 名前空間にあります。
さらに、ジェネリック型の引数として String クラスを指定することにより、System.Collections.Generic 名前空間にある任意のジェネリック コレクション クラスを厳密に型指定された文字列コレクションとして使用できます。 たとえば、List<String> または Dictionary<String,String> 型の変数を宣言することができます。
LINQ to Objects および PLINQ
LINQ to Objects により、開発者は、オブジェクト型で IEnumerable または IEnumerable<T> を実装している限り、LINQ クエリを使用してインメモリ オブジェクトにアクセスできます。 LINQ クエリはデータ アクセス用の一般的なパターンです。通常、これは標準の foreach
ループよりも簡潔で読みやすく、フィルター処理、並べ替え、およびグループ化機能を備えています。 詳細については、「LINQ to Objects (C#)」および「LINQ to Objects (Visual Basic)」を参照してください。
PLINQ は、マルチコア コンピューターをより効率的に使用することにより、多くのシナリオでより高速にクエリを実行できる LINQ to Objects の並列実装を提供します。 詳細については、「Parallel LINQ (PLINQ)」を参照してください。
関連項目
.NET