ジェネリック コレクションを使用する状況
更新 : 2007 年 11 月
通常は、ジェネリック コレクションを使用することをお勧めします。それは、タイプ セーフの利点をすぐに得られるからです。つまり、基本コレクション型から派生させて、型に固有のメンバを実装する必要がありません。また、コレクションの要素が値型である場合、ジェネリック コレクション型は、一般に、対応する非ジェネリック コレクション型 (および非ジェネリック基本コレクション型から派生した型) よりもパフォーマンスが優れています。これは、ジェネリックでは要素をボックス化する必要がないためです。
既存のコレクション型に対応するジェネリック型を次に示します。
Dictionary<TKey, TValue> は、Hashtable に対応するジェネリック クラスです。
Collection<T> は、CollectionBase に対応するジェネリック クラスです。Collection<T> は基本クラスとして使用できますが、CollectionBase とは異なり、抽象クラスではありません。このため、非常に簡単に使用できます。
ReadOnlyCollection<T> は、ReadOnlyCollectionBase に対応するジェネリック クラスです。ReadOnlyCollection<T> は抽象クラスではなく、既存の List<T> を読み取り専用のコレクションとして簡単に公開できるようにするコンストラクタを含んでいます。
Queue<T>、Stack<T>、SortedList<TKey, TValue> の各ジェネリック クラスは、それぞれ同じ名前を持つ非ジェネリック クラスに対応しています。
その他の型
対応する非ジェネリック型がないジェネリック コレクション型もいくつかあります。
LinkedList<T> は、挿入と削除の 0(1) 操作を提供する汎用のリンク リストです。
SortedDictionary<TKey, TValue> は、O (log n) の挿入および取得操作を使用して並べ替えられたディクショナリで、SortedList<TKey, TValue> の代わりに使用すると便利です。
KeyedCollection<TKey, TItem> はリストとディクショナリを混合したクラスであり、独自のキーを含むオブジェクトを格納する手段を提供します。
LINQ to Objects
LINQ to Objects 機能を使用すると、オブジェクト型が IEnumerable または IEnumerable<T> を実装している限り、LINQ クエリを使ってメモリ内オブジェクトにアクセスできます。LINQ クエリはデータ アクセス用の一般的なパターンです。通常、これは標準の foreach ループよりも簡潔で読みやすく、フィルタ処理、並べ替え、およびグループ化機能を備えています。さらに、LINQ クエリによってパフォーマンスを向上させることができます。詳細については、「LINQ to Objects」を参照してください。
その他の機能
いくつかのジェネリック型には、非ジェネリック コレクション型には存在しない機能があります。たとえば、非ジェネリックの ArrayList クラスに対応する List<T> クラスには、汎用デリゲートを受け入れるメソッドが多数あります。リストを検索するためのメソッドを指定できるようにする Predicate<T> デリゲート、リストの各要素に対して作用するメソッドを表す Action<T> デリゲート、型間の変換を定義できるようにする Converter<TInput, TOutput> デリゲートなどです。
List<T> クラスは、独自の IComparer<T> ジェネリック インターフェイスの実装を指定してリストの並べ替えと検索を実行できるようにします。SortedDictionary<TKey, TValue> クラスと SortedList<TKey, TValue> クラスにもこの機能があります。これらのクラスでは、さらに、コレクションの作成時に比較演算子を指定できます。同様に、Dictionary<TKey, TValue> クラスと KeyedCollection<TKey, TItem> クラスでは、独自の等値比較演算子を指定できます。