コレクション クラスの選択
コレクション クラスは、慎重に選択してください。 型の選択を誤ると、コレクションの使用が制限される可能性があります。 一般に、.NET Framework Version 1.1 を明示的に対象とする場合を除き、System.Collections 名前空間の型は使用しないでください。 ジェネリック バージョンと同時実行バージョンのコレクションは、タイプ セーフなどが向上するのでお勧めします。
次の点について検討してください。
要素の値を取得した後で通常その要素が破棄される、要素が順番に並んだリストが必要かどうか。
この種のリストが必要で、先入れ先出し (FIFO: First In First Out) を必要とする場合は、Queue クラスまたは Queue<T> ジェネリック クラスを使用することを検討します。 後入れ先出し (LIFO: Last In First Out) を必要とする場合は、Stack クラスまたは Stack<T> ジェネリック クラスを使用することを検討します。 複数のスレッドからの安全なアクセスが必要な場合は、同時実行バージョンの ConcurrentQueue<T> および ConcurrentStack<T> を使用します。
必要でない場合は、その他のコレクションの使用を検討します。
FIFO、LIFO、ランダムなどの特定の順序の要素にアクセスする必要があるか。
Queue クラスと Queue<T> ジェネリック クラスまたは ConcurrentQueue<T> ジェネリック クラスは、FIFO アクセスを提供します。 詳細については、「スレッド セーフなコレクションを使用する状況」を参照してください。
Stack クラスと Stack<T> ジェネリック クラスまたは ConcurrentStack<T> ジェネリック クラスは、LIFO アクセスを提供します。 詳細については、「スレッド セーフなコレクションを使用する状況」を参照してください。
LinkedList<T> ジェネリック クラスでは、先頭から末尾へ、または末尾から先頭への順次アクセスが可能です。
インデックスによって各要素にアクセスする必要があるかどうか。
ArrayList クラスと StringCollection クラス、および List<T> ジェネリック クラスでは、要素に付けられた 0 から始まるインデックス番号を使用して要素にアクセスできます。
Hashtable、SortedList、ListDictionary、StringDictionary の各クラス、および Dictionary<TKey, TValue> ジェネリック クラスと SortedDictionary<TKey, TValue> ジェネリック クラスでは、要素のキーを使用して要素にアクセスできます。
NameObjectCollectionBase クラスと NameValueCollection クラス、および KeyedCollection<TKey, TItem> ジェネリック クラスと SortedList<TKey, TValue> ジェネリック クラスでは、要素に付けられた 0 から始まるインデックス番号または要素のキーのいずれかを使用して要素にアクセスできます。
各要素に 1 つの値、1 つのキーと 1 つの値の組み合わせ、または 1 つのキーと複数の値の組み合わせのいずれを格納するか。
1 つの値の場合は、IList インターフェイスまたは IList<T> ジェネリック インターフェイスに基づいた任意のコレクションを使用します。
1 つのキーと 1 つの値の場合は、IDictionary インターフェイスまたは IDictionary<TKey, TValue> ジェネリック インターフェイスに基づいた任意のコレクションを使用します。
埋め込みキーを持つ 1 つの値の場合は、KeyedCollection<TKey, TItem> ジェネリック クラスを使用します。
1 つのキーと複数の値の場合は、NameValueCollection クラスを使用します。
要素が格納された順序とは異なる順序で要素を並べ替える必要があるかどうか。
Hashtable クラスは、ハッシュ コードによって要素を並べ替えます。
SortedList クラスと SortedDictionary<TKey, TValue> ジェネリック クラスと SortedList<TKey, TValue> ジェネリック クラスは、IComparer インターフェイスと IComparer<T> ジェネリック インターフェイスに基づいて、キーによって要素を並べ替えます。
ArrayList には、IComparer の実装をパラメーターとして受け取る Sort メソッドが用意されています。 これに対応する List<T> ジェネリック クラスは、IComparer<T> ジェネリック インターフェイスの実装をパラメーターとして受け取る Sort メソッドを提供します。
情報の高速な検索と取得が必要かどうか。
- 小規模なコレクション (10 項目以下) の場合は、ListDictionary の方が Hashtable より高速です。 Dictionary<TKey, TValue> ジェネリック クラスの検索機能は、SortedDictionary<TKey, TValue> ジェネリック クラスより高速です。 マルチスレッドの実装は ConcurrentDictionary<TKey, TValue> です。 ConcurrentBag<T> は、順序なしのデータの高速マルチスレッド挿入を実現します。 両方のマルチスレッド型の詳細については、「スレッド セーフなコレクションを使用する状況」を参照してください。
文字列だけを受け入れるコレクションが必要かどうか。
StringCollection (IList がベース) と StringDictionary (IDictionary がベース) は System.Collections.Specialized 名前空間に含まれます。
さらに、ジェネリック型の引数に String クラスを指定すると、System.Collections.Generic 名前空間の任意のジェネリック コレクション クラスを厳密に型指定された文字列コレクションとして使用できます。
LINQ to Objects および PLINQ
LINQ to Objects では、オブジェクト型が IEnumerable または IEnumerable<T> を実装している限り、LINQ クエリを使用してメモリ内オブジェクトにアクセスできます。 LINQ クエリはデータ アクセス用の一般的なパターンです。通常、これは標準の foreach ループよりも簡潔で読みやすく、フィルター処理、並べ替え、およびグループ化機能を備えています。 詳細については、「LINQ to Objects」を参照してください。
PLINQ は、マルチコア コンピューターをより効率的に使用することによってさまざまなシナリオでクエリ実行を高速化できる、LINQ to Objects の並列実装です。 詳細については、「Parallel LINQ (PLINQ)」を参照してください。
参照
参照
System.Collections.Specialized