c#のディクショナリー(Dictionary)について見ていきたいと思います。
Dictionaryって何?どうやって使うの?というC#初心者の方向けに、簡単に説明していきたいと思います。
ディクショナリ・Dictionaryとは?
Dictionary=辞書。Key:キーとValue(値)をペアに持つコレクションを言います。
↓このようなイメージです。まだこのDictionaryには何も登録していないので空です。
↓これに値を入れてみましょう!
例えば、「名前 ⇔ 身長」をペアにして登録する例を挙げてみます。
「パパの身長は175cm、ママの身長は160cm、長女の身長は120cm」これをDictionaryに登録してみると、このようなイメージです↓
Dictionaryを使った実装をしてみよう
先ほどの例を使って、実際にプログラムを組んでみましょう。
サンプルアプリとして↑このような簡単な画面を作って動作確認していきます。ボタンを3つ設けました。Dictionaryに値をセットするボタン、またゲットするボタンが2つです。
まずは19行目で、Dictionaryメンバ変数を定義します。15行目の画面のコンストラクタでnewしてインスタンスを生成してあげます。newしてあげないと「dic」にnullアクセスで例外発生するので忘れずに。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | using System; using System.Collections.Generic; using System.Diagnostics; using System.Windows.Forms; namespace Sample { public partial class Form1 : Form { public Form1() { InitializeComponent(); // Dictionary インスタンスを生成 this.dic = new Dictionary<string, int>(); } // Dictionary メンバ変数を定義 private Dictionary<string, int> dic; private void button1_Click(object sender, EventArgs e) { // Dictionary に値をセットする this.dic["パパ"] = 175; this.dic["ママ"] = 160; this.dic["長女"] = 120; } private void button2_Click(object sender, EventArgs e) { // Dictionary から値をゲットする(その1) int papaValue = this.dic["パパ"]; Debug.WriteLine("パパ:{0}", papaValue); int mamaValue = this.dic["ママ"]; Debug.WriteLine("ママ:{0}", mamaValue); int musumeValue = this.dic["長女"]; Debug.WriteLine("長女:{0}", musumeValue); } private void button3_Click(object sender, EventArgs e) { // Dictionary から値をゲットする(その2) int papaValue; if (this.dic.TryGetValue("パパ", out papaValue)) { Debug.WriteLine("パパ:{0}", papaValue); } else { Debug.WriteLine("パパ Value 取得できませんでした。"); } int mamaValue; if (this.dic.TryGetValue("ママ", out mamaValue)) { Debug.WriteLine("ママ:{0}", mamaValue); } else { Debug.WriteLine("ママ Value 取得できませんでした。"); } int musumeValue; if (this.dic.TryGetValue("長女", out musumeValue)) { Debug.WriteLine("長女:{0}", musumeValue); } else { Debug.WriteLine("長女 Value 取得できませんでした。"); } } } } |
Dictonaryに値を設定してみよう
まずは、button1_Click関数で、Dictionaryに値を設定してみましょう(21行目から)。
Dictionaryへの値設定は↓このように設定します。
1 2 3 4 | // this.dic[Key(キー)] = Value(値); this.dic["パパ"] = 175; this.dic["ママ"] = 160; this.dic["長女"] = 120; |
Dictionaryに値を設定してみました。ブレイクポイントを貼って、メンバ変数のDictionary「dic」の中身を見てみるとこのようになっています↓
一番下で「Count」は「3」になっています。パパ&ママ&長女の3つ分ですね。
そして各要素を見てみると、「Key」「Value」で先ほど設定した値が確認できます。
- 「パパ ⇔ 175」
- 「ママ ⇔ 160」
- 「長女 ⇔ 120」
とそれぞれ、KeyとValueでペアで設定できているのが確認できます。
Dictionaryから値を取得してみよう
Dictionaryから値を取得してみましょう。
基本的な取得方法は以下の通りです。
TryGetValue関数を使って、指定した "Key" に対する "Value" を取得可能です。 "Value" は out パラメータとして指定します。
さらにTryGetValueには戻り値があります。bool型で、TryGetValueにしていたKeyが無い場合はfalseが帰ってきます。このときは out パラメターのValue(以下の例では papaValue)は何が入っているか不明ですので参照不可です。指定したKeyに対するValueがあればtrueがかえってきますので、この時は、out パラメータのValueは参照可能です。
1 2 | int papaValue; bool ret = this.dic.TryGetValue("パパ", out papaValue) |
Dictionaryはこんな時につかえる!
実際、アプリケーションを作成していくとDictionaryを使いたくなるケースはたくさんあります。
これまでの説明通りKeyとValueでペアで値を保持できるのがDictionaryです。その通り、種別「Key」毎に異なる値を保持しておきたい時に有効です。
ただし、基本的には一つのKeyに対して一つの値(Value)しか保存できないので注意が必要です。Keyに対してValueを設定すると前回までの値は上書きされます。
もちろん、Valueを配列やListにすれば、その限りではありませんが(この話は別記事にてまとめたいと思います)。