コレクション クラスの選択
更新 : 2007 年 11 月
System.Collections クラスは、慎重に選択してください。型の選択を誤ると、コレクションの使用が制限される可能性があります。
次の点について検討してください。
要素の値を取得した後で通常その要素が破棄される、要素が順番に並んだリストが必要かどうか。
FIFO、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> ジェネリック クラスより高速です。
文字列だけを受け入れるコレクションが必要かどうか。
StringCollection (IList がベース) と StringDictionary (IDictionaryがベース) は System.Collections.Specialized 名前空間に含まれます。
さらに、ジェネリック型の引数に String クラスを指定すると、System.Collections.Generic 名前空間の任意のジェネリック コレクション クラスを厳密に型指定された文字列コレクションとして使用できます。
LINQ to Objects
LINQ to Objects では、オブジェクト型が IEnumerable または IEnumerable<T> を実装している限り、LINQ クエリを使用してメモリ内オブジェクトにアクセスできます。LINQ クエリは、データ アクセス用の共通のパターンを提供します。これは、通常、標準の foreach ループよりも簡潔で読みやすく、フィルタ処理、並べ替え、およびグループ化の機能を備えています。さらに、LINQ クエリによってパフォーマンスを向上させることもできます。詳細については、「LINQ to Objects」を参照してください。
参照
参照
System.Collections.Specialized