60
76

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C#(.NET)コレクションの使い分けヒント

Last updated at Posted at 2017-04-08

概要

.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を使うことになるはず。

System.Collections.Concurrent:Concurrentコレクション

マルチスレッドに特化したコレクション。

System.Collections.ObjectModel:ObjectModelコレクション

特定の用途で使用する。XAMLアプリを作ったことがある人にはおなじみ。

System.Collections.Specialized:Specializedコレクション

こちらも特定の用途でしか使わない。

System.Collections:レガシーなコレクション

産廃。使うな。

60
76
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
60
76

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?