<処理能力の問題>
非ジェネリックコレクションは要素を全て
Object 型で管理します。つまり要素の取り扱いには必ず型変換が必要となり
ます。 つまり頻繁にボックス化・ボックス化解除が暗黙的に実行されます。 この為コレクション要素を扱う場合(ほと
んどの場合が該当)は処理速度が非常に遅いです。 また、コンパイル時の型チェックは行われませんので、全て実行時
のチェックが必要です。
<ジェネリックコレクションの登場>
.NET
Framework2.0 よりジェネリックコレクションが登場しました。 System.Collections.Generic 名前空間 に属しま
す。ジェネリックコレクションは要素の型を明示的に指定することが可能(必要)となり、型変換不要で高速に配列処
理が行えます。逆に言えば、コンパイル時にもチェックが入りますので、より高精度で安全な開発をすることが可能で
す。
また、
LINQ などの拡張機能を扱えるといった利点もあります。
非ジェネリックコレクションとジェネリックコレクションの対比表は以下の通りです。
グループ 非ジ ェネリック ジェネリック 概要
リスト系
(挿入順番に
意味があるコ
レクション)
ArrayList List
インデックスを使って要素を読み書きす
る 。配列で実装されたリスト。
× LinkedList
双方向連結リスト 。シーケンスの要素挿入
(末尾以外)が高速に行える。但し、ラン
ダムアクセスは出来ない。
Stack Stack
LIFO (後入先出)コレクション。要素を上
に積み上げる。よって上をどかさないと下
の要素は取り出せない。
Queue Queue
FIFO 待ち行列 コレクション。後ろに要
素を追加して前から出す。 OS のメッセージ
ループの仕組みはこれを使用。
辞書系
(キーと値と
セットで指
定)
HashTable Dictionary<TKey, TValue>
最も高速に処理される辞書。キーによる順
番は保障されないので、追加した順番に列
挙されるとは限らない。よって値によるソ
ートは独自実装が必要。
× SortedDictionary<TKey, TValue>
二分探索 木実装による辞書。キーによるソ
ートが自動的に実行される。その為検索や
要素追加は高速に行われる。
要素数が大きく変わる場合や最初の領域を
最小限に抑えたい場合に有効。
SortedList SortedList<TKey, TValue> ソート済みの
セット系
(挿入順番に
意味が無いコ
レクション)
× HashSet Dictionary のセット版。
× SortedSet
SortedDictionary のセット版。要素が自動
的にソートした状態で保持される。
次項でよく使われるジェネリックコレクションを2つ説明します
。