ジェネリック コレクションを使用する状況
ジェネリック コレクションでは、基本コレクション型から派生して型固有のメンバーを実装することなく、タイプ セーフの利点を即座に得ることができます。 また、ジェネリックでは要素をボックス化する必要がないため、コレクションの要素が値型である場合、一般的に、ジェネリック コレクション型は、対応する非ジェネリック コレクション型 (および、非ジェネリックの基本コレクション型から派生した型) よりもパフォーマンスに優れています。
.NET Standard 1.0 以降を対象にしたプログラムで、複数のスレッドで同時に項目をコレクションに追加またはコレクションから削除する可能性がある場合は、System.Collections.Concurrent 名前空間のジェネリック コレクション クラスを使用します。 また、不変にする必要がある場合は、System.Collections.Immutable 名前空間のジェネリック コレクション クラスを検討してください。
次のジェネリック型は、既存のコレクション型に対応しています。
Dictionary<TKey,TValue> および ConcurrentDictionary<TKey,TValue> は、 Hashtableに対応するジェネリック クラスです。
Collection<T> は、 CollectionBaseに対応するジェネリック クラスです。 Collection<T> は基本クラスとして使用できますが、CollectionBase とは異なり抽象クラスではないので、使いやすいです。
ReadOnlyCollection<T> は、 ReadOnlyCollectionBaseに対応するジェネリック クラスです。 ReadOnlyCollection<T> は抽象クラスではなく、既存の List<T> を読み取り専用のコレクションとして簡単に公開できるようにするコンストラクターを含んでいます。
Queue<T>、ConcurrentQueue<T>、ImmutableQueue<T>、ImmutableArray<T>、SortedList<TKey,TValue> および ImmutableSortedSet<T> ジェネリック クラスは、同じ名前を持つそれぞれの非ジェネリック クラスに対応しています。
その他の型
いくつかのジェネリック コレクション型には、対応する非ジェネリック型がありません。 次に例を示します。
LinkedList<T> は、挿入と削除の O(1) 操作を提供する汎用のリンク リストです。
SortedDictionary<TKey,TValue> は、挿入と取得の O(log
n
) 操作で並べ替えられたディクショナリで、 SortedList<TKey,TValue>の代替として役立ちます。KeyedCollection<TKey,TItem> は、リストとディクショナリを組み合わせたもので、独自のキーを含むオブジェクトの格納方法を提供します。
BlockingCollection<T> は、境界ブロッキング機能を備えたコレクション クラスを実装します。
ConcurrentBag<T> は、順序のない要素の高速な挿入および削除を提供します。
不変ビルダー
System.Collections.Immutable 名前空間には、アプリに不変機能が必要な場合に使用できるジェネリック コレクション型があります。 すべての不変コレクション型には、複数の変更を実行しているときのパフォーマンスを最適化する Builder
クラスがあります。 Builder
クラスは、変更可能な状態の操作をバッチ処理します。 すべての変更が完了したら、ToImmutable
メソッドを呼び出してすべてのノードを "凍結" し、ImmutableList<T> などの不変ジェネリック コレクションを作成します。
Builder
オブジェクトは、非ジェネリック CreateBuilder()
メソッドを呼び出すことによって作成できます。 Builder
インスタンスからは ToImmutable()
を呼び出すことができます。 同様に、Immutable*
コレクションからは ToBuilder()
を呼び出して、ジェネリック不変コレクションからビルダー インスタンスを作成できます。 Builder
のさまざまな型を次に示します。
- ImmutableArray<T>.Builder
- ImmutableDictionary<TKey,TValue>.Builder
- ImmutableHashSet<T>.Builder
- ImmutableList<T>.Builder
- ImmutableSortedDictionary<TKey,TValue>.Builder
- ImmutableSortedSet<T>.Builder
LINQ to Objects
LINQ to Objects 機能では、オブジェクト型が System.Collections.IEnumerable インターフェイスまたは System.Collections.Generic.IEnumerable<T> インターフェイスを実装している限り、LINQ クエリを使用してメモリ内オブジェクトにアクセスできます。 LINQ クエリには、データにアクセスする一般的なパターンがあります。通常、これは標準の foreach
ループよりも簡潔で読みやすく、フィルター処理、並べ替え、およびグループ化機能を備えています。 さらに、LINQ クエリによってパフォーマンスを向上させることができます。 詳細については、「LINQ to Objects (C#)」、「LINQ to Objects (Visual Basic)」、および「Parallel LINQ (PLINQ)」を参照してください。
その他の機能
一部のジェネリック型には、非ジェネリック コレクション型にはない機能があります。 たとえば、非ジェネリックの List<T> クラスに対応する ArrayList クラスには、リストを検索するメソッドを指定できる Predicate<T> デリゲートや、リストの各要素に作用するメソッドを表す Action<T> デリゲートや、型間の変換を定義できるようにする Converter<TInput,TOutput> デリゲートなどの、汎用デリゲートを受け取るメソッドが多数あります。
List<T> クラスを使用すると、リストの並べ替えと検索を行う独自の IComparer<T> ジェネリック インターフェイス実装を指定できます。 SortedDictionary<TKey,TValue> クラスと SortedList<TKey,TValue> クラスにもこの機能があります。 また、これらのクラスを使用すると、コレクションの作成時に比較演算子を指定できます。 同様に、Dictionary<TKey,TValue> クラスと KeyedCollection<TKey,TItem> クラスを使用すると、独自の等値比較子を指定できます。
関連項目
.NET