【C#入門】DictionaryのKey、Valueの使い方(要素の追加、取得も解説)

Dictionaryって使っていますか?

C#では連想配列をDictionaryクラスで扱うことが可能です。連想配列ではKeyと呼ばれるインデックス番号の代わりに使われる名前と、Valueと呼ばれる値をセットで扱います。

この記事では、Dictionaryについて

  • Dictionaryとは
  • Dictionaryの宣言、定義、初期化
  • Addで要素を追加
  • foreachで要素を取得する方法
  • KeyでValueを取得する方法
  • コピーする方法
  • 要素を検索する方法
  • 要素をソートする方法
  • Listとの相互変換

など基本的な内容から、応用的な内容についても解説していきます。

今回はDictionaryについて、使い方をわかりやすく解説します!

Dictionaryとは

Dictionaryでは、Keyと呼ばれるインデックス番号の代わりに使われる名前と、Valueと呼ばれる値をセットで扱います。

KeyとValueをセットで扱う配列のことを連想配列といいます。

C#で連想配列を扱うためのクラスがDictionaryクラスです。DictionaryクラスではKeyを使ってValueの値を取得します。

ちなみに、Keyの値を重複させることはできませんので、注意しましょう!

Listとの違いについて

Listはインデックス番号を使って要素の値を取得します。

これに対して、DictionaryではKeyの値を使ってValueの値を取得するので、数値以外の文字列などを指定することで、セットの値を取得します。

項目とその値というように、セットでデータを扱う必要がある場合に使用します。

Dictionaryの宣言、定義、初期化

Dictionaryは以下のように宣言、定義します。

Dictionaryクラスを使用するには、usingを使ってSystem.Collections.Genericクラスを呼び出しておく必要があります。

また以下のように記述することもできます。

宣言、定義と同時に初期化することも可能です。

Addで要素を追加

要素を追加するには、Addメソッドを使用します。

Addメソッドは以下のように定義されています。

引数keyでは追加する要素のキーを指定します。引数valueでは追加する要素の値を指定します。

サンプルコードで確認しましょう。

サンプルコードの実行結果は、次にご紹介するforeachを使って出力表示するので、そちらで解説しますね!

ちなみに、同じKeyの値の要素を追加するとこはできません。

注意しましょう!

foreachで要素を取得する方法

foreachで要素を取得する方法についてご紹介します。

KeyとValue両方を取得する方法

KeyValuePair構造体を使って、KeyとValueの両方を取得します。

サンプルコードで確認しましょう。

実行結果:

Keyのみを取得する方法

DictionaryからKeyのみを取得するにはKeysプロパティを使用します。

実行結果:

Valueのみを取得する方法

DictionaryからValueのみを取得するにはValuesプロパティを使用します。

実行結果:

KeyでValueを取得する方法

Dictionaryの特徴はインデックス番号ではなく、Keyとなる文字列などでもValueの値を取得できるところでした。

サンプルコードで確認しましょう。

実行結果:

コピーする方法

Dictionaryのオブジェクトをコピーしたい場合があります。

そんな場合にはコピー先のオブジェクトの宣言、定義時にコンストラクタの引数にコピー元のオブジェクトを指定すればコピーすることができます。

サンプルコードで確認しましょう。

実行結果:

要素を検索する方法

Dictionaryの要素のKeyもしはValueに指定の値が含まれているか検索することができます。

Keyの場合とValueの場合、それぞれ確認してみましょう。

Keyを検索する方法

ContainsKeyメソッドを使います。

ContainsKeyメソッドは以下のように定義されています。

サンプルコードで確認しましょう。

実行結果:

Valueを検索する方法

ContainsValueメソッドを使います。

ContainsValueメソッドは以下のように定義されています。

サンプルコードで確認しましょう。

実行結果:

要素をソートする方法

Dictionaryの要素をソートするには、LINQのOrderByメソッドを使う方法KeyValuePair構造体のListを使う方法などがあります。

LINQを使う方法

LINQのOrderByメソッドを使って、引数にラムダ式で記述すると簡単にソートすることができます。

実行結果:

このサンプルコードでは、DictionaryオブジェクトmyTableのValueの要素で昇順にソートをしています。

LINQのOrderByメソッドを使ってソートしていますが、引数の一部をx.Keyと変更することでKeyの要素でソートすることもできます。

KeyValuePairのListを使う方法

foreachでKey、Valueともに取得する際に使用したKeyValuePair構造体を要素の型にしてリストを作成することができます。

リストが作成できたら、リストとしてソートすることができるので便利です。

サンプルコードで確認しましょう。

実行結果:

このサンプルコードでは、KeyValuePair構造体を要素の型にしてListのオブジェクトlistを作成しています。

listからSortメソッドを呼び出し、引数にラムダ式を指定してKeyの要素で逆順にソートしています。この場合もラムダ式の一部をb.Value.CompareTo(a.Value)と変更することで、Valueでソートすることも可能です。

List型のオブジェクトの場合、今回ご紹介したラムダ式でのソートの他に、デリゲートを使う方法やCompareメソッド、CompareToメソッドを使う方法のように多くの方法で自由にカスタマイズしてソートを行うこともできます。

詳しくはこちらのサイトで解説しているので、ぜひ参考にしてください。

【C#入門】配列、Listをソートする方法(降順、カスタマイズも解説)
更新日 : 2019年4月25日

Listとの相互変換

先ほどの要素のソートでご紹介した場合のように、Dictionary型のオブジェクトをList型に変換すると便利な場合があります。

逆にList型のオブジェクトをDictionary型に変換したい場合もあります。

それぞれに変換する方法についてみていきましょう。

DictionaryからListへ変換

DictionaryのKeyやValueをListへ変換する方法についてみていきましょう。

DictionaryのKeysプロパティやValuesプロパティを使ってKeyの値のみやValueの値のみを取得することができました。

これをList型のオブジェクトを宣言、定義する際のコンストラクタの引数に指定することでコピーを作成することができます。

サンプルコードで確認しましょう。

実行結果:

ListからDictionaryへ変換

2つのListからDictionaryへ変換する方法についてご紹介します。

LINQのZipメソッドを使って2つのListの要素をプロパティに持つ匿名型のシーケンスを作ります。

それをToDictionaryメソッドでDictionary型に変換します。

サンプルコードで確認しましょう。

実行結果:

まとめ

ここでは、Dictionaryについて説明しました。

Dictionaryの特徴はKeyとValueをセットで扱うことでした。Listのようにインデックス番号ではなく、Keyに指定した文字列などでValueの値を取得することができます。

使いこなすことができるように、この記事を何度も参考にして下さいね!

現役フリーランスエンジニアによる無料体験レッスン実施中!

もし、あなたが、

  • 経験、年齢、学歴に不安がある
  • 挫折しない学習方法が知りたい
  • アプリ開発で困っている
  • エンジニアの”生”の声が聞きたい!
  • 仕事獲得の仕方がわからない
  • エンジニアに転職したいが何をすればいいかわからない

など、プログラミング学習やキャリアのことでお困りであれば、まずは『無料体験レッスン』にお申し込み下さい。

あなたにとって、最適の解決策をご提案させていただきます。

詳しくは下の画像から詳しいサービス内容をご確認ください。

cta_mtm3

LINEで送る
Pocket

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説