【C#】Dictionary型の使いどころ
- ListとDictionaryをなんとなく使っている
- Dictionaryを使っていない
C#を初めて、Dictionary型の使いどころがまだわからない方向けに、
どんな特徴があるのかについて紹介する記事です。
Dictionary型はList型よりはるかに高速な処理ができるので
使いこなしたいところです。
目次
Dictionary型は唯一性がある、List型にはない
- Dictionary:連想配列
- List:配列
Dictionary型は連想配列に分類されます。
連想配列をかみ砕くとデータベースのプライマリーキーのように
キーがついて、それに対応するバリューが紐づく配列のことですね。
こんな感じです。

Dictionary型のキーもプライマリーキーに似て唯一性がありますので、
同じキーを追加しようとするとエラーが発生します。
対してList型にはDictionary型のバリュー相当しかありませんので
唯一性もありません。それゆえ重複が可能です。
この唯一性こそ、Dictionary型とList型との違いの一つです。
Dictionary型のキーに対しての操作が高速
Dictionary型とList型の違いはその配列の探し方にあります。
Dictionary型がKeyに対して操作することが得意なことに対して
List型はValueに対して操作することが得意です。
生徒の集団から特定の生徒を取得するサンプルを
それぞれDictionary型とList型と見てみましょう。
それぞれ4つのデータを持ちますが、
そこから「Id = 1」の生徒を取得する例です。
Dictionary型の場合[1]でキーを用いたアクセスできます。
List型はできるだけ単純な表記になるように
Singleメソッドを使用して取得しました。
Dictionary型のキーを使用したデータアクセスは
データベースのプライマリーキーの特徴と同じく高速です。
あくまで簡単な検証ですが、
私の手元ではList型に対して10倍ほど性能差が出ました。
さらにキーアクセスだけですと「students[1]」となり
記述もシンプルでDictionary型の強みが生かされます。
Dictionary型はValueに対しての操作は性能は同じだが、可読性の点でList型に負ける
Dictionary型はValueに対しての操作はListより複雑になります。
早速サンプルを見ていきましょう。
先ほどのデータを参考に生徒「suzuki」を取得します。
Dictionary型の場合はKeyとValueに分けてからValueを操作していきます。
List型はKeyがありませんので直接Valueを操作できます。
このため、先ほどとは逆でDictionary型よりもList型のほうが
シンプルになりました。
Dictionary型の場合、KeyとValueでわかれているため
List型に比べて冗長的ですね。
ちなみに性能では、Dictionary型が数パーセント遅い程度で
大きな性能差はありませんでした。
おそらくは、Valueに対して行う操作はList型とDinctinary型で
同じ仕組みを使っているため、違いが生じにくいと考えています。
性能が同程度なら、読みやすくて書きやすいList型のほうをおすすめします。
まとめ
まとめますと
- 唯一性がありKeyの操作だけで完結する場合はDictionary型を使う
- それ以外はList型を使う
になります。
唯一性がないデータにDictionary型を使っていしまいますと
すぐキー違反でエラーが発生してしまうので注意したいところです。
しかし、Dictionary型が活躍できる場面になれば、
Listよりも性能がかなり良いです。
負荷がかかる処理やパフォーマンスを求められる処理で
Dictionary型を使うことができるかどうかを考えるのはありだと思います。