【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型を使うことができるかどうかを考えるのはありだと思います。