必ずコレクション クラスを慎重に選択してください。 間違った型を使用すると、コレクションの使用が制限される可能性があります。
Von Bedeutung
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 アクセスを提供します。 詳細については、「 Thread-Safe コレクションを使用するタイミング」を参照してください。
Stack クラスと、Stack<T>、ConcurrentStack<T>、およびImmutableStack<T>ジェネリック クラスはすべて LIFO アクセスを提供します。 詳細については、「 Thread-Safe コレクションを使用するタイミング」を参照してください。
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> ジェネリック クラスは、キーで要素を並べ替えます。 並べ替え順序は、IComparer クラスのSortedList インターフェイスの実装と、IComparer<T>およびSortedList<TKey,TValue>ジェネリック クラスのSortedDictionary<TKey,TValue>ジェネリック インターフェイスの実装に基づいています。 2 つのジェネリック型のうち、 SortedDictionary<TKey,TValue> は SortedList<TKey,TValue>よりも優れたパフォーマンスを提供しますが、 SortedList<TKey,TValue> は消費するメモリが少なくなります。
ArrayListは、Sort実装をパラメーターとして受け取るIComparerメソッドを提供します。 List<T>ジェネリック クラスの対応物であるこのクラスには、Sortジェネリック インターフェイスの実装をパラメーターとして受け取るIComparer<T>メソッドがあります。
情報をすばやく検索して取得する必要がありますか?
- ListDictionary は、小さいコレクション (10 項目以下) の場合は Hashtable よりも高速です。 Dictionary<TKey,TValue>ジェネリック クラスは、SortedDictionary<TKey,TValue> ジェネリック クラスよりも高速な検索を提供します。 マルチスレッド実装は ConcurrentDictionary<TKey,TValue>。 ConcurrentBag<T> は、順序付けられていないデータに対して高速なマルチスレッド挿入を提供します。 両方のマルチスレッド型の詳細については、「 Thread-Safe コレクションを使用するタイミング」を参照してください。
文字列のみを受け入れるコレクションが必要ですか?
StringCollection ( IListに基づく)と StringDictionary ( IDictionary に基づく) は、 System.Collections.Specialized 名前空間にあります。
さらに、ジェネリック型引数にSystem.Collections.Generic クラスを指定することで、String名前空間のジェネリック コレクション クラスを厳密に型指定された文字列コレクションとして使用できます。 たとえば、 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