概要
.NETには多数のコレクションが用意されている。
データが少ないうちは全部List<T>でも何とかなるが、データの数が1000個、10000個、100000個、と大きくなるにつれ、使用するコレクションによってパフォーマンスに大きな差が出てくる。
パフォーマンス特性を理解するには内部データ構造や計算量を知るのが一番よいが、まずはざっくり検討できるようヒントを作ってみた。
※内部データ構造や計算量については C#(.NET)コレクションの使い方と計算量 に書いた。
Genericコレクションの分類と使い分け
List:データの順番が重要
型 | 適する用途 |
---|---|
List<T> | インデックスによる要素の取得・変更が多い |
LinkedList<T> | 要素の追加、削除が多い |
Queue<T> | FIFO, 待ち行列とか |
Stack<T> | LIFO, Undo/Redoの実装とか |
Dictionaty:高速な索引が必要
型 | 適する用途 |
---|---|
Dictionary<TKey, TValue> | ・メモリ使用量を問わない ・参照が多い ・列挙しないか、列挙順序を問わない |
SortedDictionary<TKey, TValue> | ・メモリ使用量を抑えたい ・要素の追加、削除が多い |
SortedList<TKey, TValue> | ・メモリ使用量をもっと抑えたい ・Key/Valueをindexでもアクセスしたい |
Set:重複の排除や集合演算をしたい
型 | 適する用途 |
---|---|
HashSet<T> | メモリ使用量を問わない |
SortedSet<T> | 順序を意識した列挙が多い |
参考:.NETの主なコレクション
System.Collections.Generic:Genericコレクション
通常のプログラムであれば、主にこの名前空間のAPIを使うことになるはず。
- Dictionary<TKey, TValue>
- HashSet<T>
- LinkedList<T>
- List<T>
- Queue<T>
- SortedDictionary<TKey, TValue>
- SortedList<TKey, TValue>
- SortedSet<T>
- Stack<T>
System.Collections.Concurrent:Concurrentコレクション
マルチスレッドに特化したコレクション。
- BlockingCollection<T>
- ConcurrentBag<T>
- ConcurrentQueue<T>
- ConcurrentStack<T>
- ConcurrentDictionary<TKey, TValue>
System.Collections.ObjectModel:ObjectModelコレクション
特定の用途で使用する。XAMLアプリを作ったことがある人にはおなじみ。
System.Collections.Specialized:Specializedコレクション
こちらも特定の用途でしか使わない。
- NameValueCollection
- 他にもいくつかあるが見たことないのて省略
System.Collections:レガシーなコレクション
産廃。使うな。