今回はC#のDictionaryを使ってみたいと思います。
Dictionaryはキーと値をセットで指定し、キーで検索して値を取得する事が出来ます。
値だけを入れたい場合はリスト、キーと値のセットはDictionaryという感じですね。
リストの場合は順序があり並べ替えも可能ですが、Dictionaryは順序がないので並べ替えが出来ません。
今回のサンプルはUnity付属のMonoDevelopを使用して確認しています。
Dictionaryを使ってみる
詳しい説明は専門サイトにまかせまして・・・・(^_^;)
実際にDictonaryを使ってみましょう。
Dictonaryの宣言と生成をしてみます。
1 2 3 | Dictionary<キーの型, 値の型> dictionary = new Dictionary<キーの型, 値の型> (); |
↑のようにDictionaryとジェネリックの型を指定します。
左側にキーの型、右側に値の型を指定します。
インスタンス化する時は宣言の型の並びと合わせます(上のスクリプトの右辺)。
例えばキーをstring型、値をint型のDictionaryを作るとすれば、
1 2 3 | Dictionary<string, int> dictionary = new Dictionary<string, int> (); |
となります。
右辺で型が決まっている為、暗黙の型指定であるvarを使う事が出来ます。
1 2 3 | var dictionary = new Dictionary<string, int> (); |
記述が楽になりますね。
Dictionaryの使用サンプル
Dictionaryを使っていくつかスクリプトを組んでみます。
Dictionaryの操作メソッドはほとんどがListと同じです。
要素の値を合計するサンプル
Dictionaryの要素の値を合計するスクリプトを作成します。
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 | using UnityEngine; using System.Collections; using System.Collections.Generic; public class Learn7_1 : MonoBehaviour { // Use this for initialization void Start () { // Dictionaryを作成 Dictionary<string, int> dictionary = new Dictionary<string, int> (); dictionary ["test1"] = 1; dictionary ["test2"] = 2; dictionary ["test3"] = 3; dictionary.Add ("test4", 4); int sum = 0; // 全キーを取得し、値を足していく foreach (var key in dictionary.Keys) { sum += dictionary[key]; } Debug.Log (sum); } } |
キーをstring、値をintにしたDictionaryを作り、キーと値をセットしていきます。
その後foreach文でdictionary.Keysでキーの数を取得出来るので、それを使って要素数分キーをもとに値を取りだし、sumに足していきます。
コンソールには10が表示されます。
キーと値の型をintにしたサンプル
キーはstring以外の型も指定出来ます。
試しにキーと値の型にintを使ったサンプルを作成してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using UnityEngine; using System.Collections; using System.Collections.Generic; public class Learn7_2 : MonoBehaviour { // Use this for initialization void Start () { Dictionary<int, int> intDictionary = new Dictionary<int, int> (); // var intDictionary = new Dictionary<int, int> (); intDictionary [0] = 0; intDictionary [1] = 2; intDictionary [3] = 1; intDictionary [1] = 5; foreach (var key in intDictionary.Keys) { Debug.Log (key + " : " + intDictionary [key]); } } } |
foreach内でキーを取得し、キーとキーで取得した値を出力してます。
Dictionaryはユニークなキーを設定する必要がある為、最初にキーを1としてintDictionary[1]に2を入れますが、その後5を入れている為、最終的に最初に入れた2の値は削除されます。
値の初期化のサンプル
Dictionaryの要素を初期化する事も出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | using UnityEngine; using System.Collections; using System.Collections.Generic; public class Learn7_3 : MonoBehaviour { // Use this for initialization void Start () { var dictionary = new Dictionary<string, int>() { {"dic1", 1}, {"dic2", 2} }; foreach (var key in dictionary.Keys) { Debug.Log (key + " : " + dictionary [key]); } } } |
{}を使ってキーと値を記述し、初期値を指定します。
値の型にクラスを設定
今まではstringとintという型を指定してきましたが、他の型も設定する事が出来ます。
試しに値の型に自前のクラスの型を指定してみます。
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 | using UnityEngine; using System.Collections; using System.Collections.Generic; public class Learn7_4 : MonoBehaviour { // Use this for initialization void Start () { // 値の型は自前のクラスであるParameter型 Dictionary<string, Parameter> charas = new Dictionary<string, Parameter> (); // キーと値をセット charas ["Ethan"] = new Parameter (100, 50); charas ["Masasi"] = new Parameter (); // キャラのデータを出力 foreach (var key in charas.Keys) { Debug.Log (key + " : " + charas [key].hp + " : " + charas [key].attackPower); } } // Parameterクラスの定義 private class Parameter { public int hp; public int attackPower; public Parameter(int hp = 20, int attackPower = 10) { this.hp = hp; this.attackPower = attackPower; } } } |
Dictionaryの値の型にParameterクラスを定義したので、値にParameterクラスのインスタンスを設定する事が出来ます。
値を設定する時にParameterクラスをインスタンス化し、Parameterのフィールドを設定しています。
Parameterのフィールドをpublicにしているので、charas[key].hpという記述でhpの値を取得出来ます。
フィールドは本来privateに設定してアクセサー(SetやGet)を使って取得するか、プロパティを介してアクセスします。
おわりに
Dictionaryを使うとキーと値をセットで使用する事が出来るので、色々用途はありそうですね(パッと思い浮かばないけど・・・・)。
並び順が関係なく、キーで値を取得するデータを使いたい時は便利ですね。(^_^)v