ホームに戻る
出典 :
C#(.NET)コレクションの使い分けヒント - Qiita C#(.NET)コレクションの使い方と計算量 - Qiita
関連 :
[C++]コンテナ キュー(Queue)とスタック(Stack) コレクションのソート コレクション初期化子 Dictionary(連想配列)
目次 :

コレクションとは

「指定した型のデータを複数個格納するデータ構造」のこと。C++(STL)におけるコンテナと同様の概念。
要素数を動的に変更できる、要素同士を関連付けられるなど、複数のデータを体系的に管理できる機能が備わっている。

コレクションの種類

以下、<> 内の各要素(T, TKey, TValue)はコレクションに格納するデータの型を示す。

List : データの並び順が重要なコレクション

System.Collections.Generic に含まれる。
LinkedList を除き連結リストではない点に注意。
名称 概要 実装方式 相当する
C++(STL)の
コンテナ
備考
List<T> 最も汎用的なコレクションクラス。
インデクスによる要素の取得、変更(ランダムアクセス)が多い場合に適する。
配列 vector 継承されることが想定されていない
LinkedList<T> 要素の追加・削除が多い場合に適する。
挿入、削除(ノード指定)が非常に高速。
インデクスによる検索(ランダムアクセス)は不可。
連結リスト list
Queue<T> キュー(FIFO)。エンキュー、デキューが非常に高速。 循環配列 queue
Stack<T> スタック(LIFO)。プッシュ、ポップが非常に高速。 配列 stack

Dictionary : キーに対応した値を高速に索引できるコレクション(連想配列)

System.Collections.Generic に含まれる。
名称 概要 実装方式 相当する
C++(STL)の
コンテナ
備考
Dictionary<TKey, TValue> キーの検索が非常に高速。
格納順が保証されない。
(挿入順に格納されるとは限らない。)
ハッシュテーブル unordered_map メモリ消費が比較的大きい。
SortedDictionary<TKey, TValue> 格納順が保証される。
要素の追加・削除が多い場合に適する。
二分探索木 Dictionaryに比べ、
メモリ消費が小さい。
SortedList<TKey, TValue> 格納順(ソート後)が保証される。
インデクスでもアクセス可能。
ソートされた配列 map SortedDictionaryに比べ、
メモリ消費が小さい。

Set : 重複を排除できるコレクション

System.Collections.Generic に含まれる。
Set同士の集合演算(OR、ANDなど)が可能。
名称 概要 実装方式 相当する
C++(STL)の
コンテナ
備考
HashSet<T> 値の検索が非常に高速。
格納順が保証されない。
(挿入順に格納されるとは限らない。)
ハッシュテーブル unordered_set メモリ消費が比較的大きい。
SortedSet<T> 格納順が保証される。
インデクスでもアクセス可能。
二分探索木 set

Concurrent : スレッドセーフなコレクション

System.Collections.Concurrent に含まれる。
複数のスレッドからアクセスを受けても破綻しない。
名称 概要
BlockingCollection<T> ConcurrentBag, ConcurrentQueue, ConcurrentStack をラップできる。
通常はFIFOとして動作。
ConcurrentBag<T> データバッグ(取り出し順序不定)。
ConcurrentQueue<T> スレッドセーフなQueue。
ConcurrentStack<T> スレッドセーフなStack。
ConcurrentDictionary<TKey, TValue> スレッドセーフなDictionary。

その他

名称 概要
Collection<T> 上記の各コレクションの基底クラス。すべてのコレクションをラップできる。