今回の記事では辞書型(ディクショナリー、Dictionary)について解説します。
辞書型も前回扱ったListクラスと同じくコレクションの一種になります。
前回の記事:
簡単にデータにアクセスできる辞書型(ディクショナリー)って何?
辞書型はキーとなる値とそれに対応する値のペアからなるコレクションになります。キーおよび値の型はテンプレートで別の型を指定できます。
要素にアクセスする時は配列やリストの場合は添字を使っていましたが、辞書型の場合はキーを使用します。そのため辞書型はリストより指定した値にアクセスしやすいコレクションになります。
その代わり、辞書型のデータの並びはこちらから制御できません。ループ処理の際には要素の順番に依存しない処理を書く必要があります。
主なメンバは次のものになります。
- 追加:Add(key, value)
- 削除:Remove(key)
- キーチェック:Contains(key)
- 全てのキー:Keysプロパティ
- 全ての値:Valuesプロパティ
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 |
Dictionary<string, int> dict = new Dictionary<string, int>(); //要素を追加する時はキーと値を一緒に渡す。 dict.Add("Unity", 100); dict.Add("Game", 200); dict["Key"] = 300; //<- 添字のように使うこともできる。 //要素数とキーの確認 var c = dict.Count; // <- c == 3 var b = dict.Contains("Key"); // <- b == true //要素の値にアクセスする時はキーを添字がわりに使う。 var n = dict["Key"]; // <- n == 300 dict["Key"] = -1; // <- 値を上書きしている。 //要素の削除にはキーを使う。 dict.Remove("Key"); b = dict.Contains("Key"); // <- b == false //辞書型の要素のループにはforeachを使う foreach(KeyValuePair<string, int> pair in dict) { var key = pair.Key; // <- キー var value = pair.Value; // <- ペアとなる値 } //キーだけをループしたい時はKeysを使う。 foreach(var key in dict.Keys) { ... } //値だけをループしたい時はValuesを使う。 foreach(var value in dict.Values) { ... } |
KeyValuePair<TKey, TValue>型について
辞書型はキーと値をKeyValuePair<TKey, TValue>型で管理しています。
KeyValuePair<TKey, TValue>型も辞書型と同じくテンプレートを使用しています。なのでテンプレートに型を指定する必要がありますが、こちらの場合は辞書型に渡したテンプレートの型を内部で設定してくれるのであまり気にする必要はありません。
KeyValuePair<TKey, TValue>
型自体はとても簡単な内容になり、次のプロパティが定義されています。
- Key:キーを表すプロパティ。
- Value:値を表すプロパティ。
辞書型が継承しているインターフェース
辞書型は次のインターフェースを継承しています。
- ICollection
- ICollection<KeyValuePair<TKey,TValue>>
- IReadOnlyCollection<KeyValuePair<TKey,TValue>>
- IDictionary
- IDictionary<TKey,TValue>
- IReadOnlyDictionary<TKey,TValue>
- IEnumerable<KeyValuePair<TKey,TValue>>
- IEnumerable
- ISerializable
- IDeserializationCallback
辞書型で実装できることを知りたい場合は上記のインターフェースについて調べてみましょう。
【実践】Unityで辞書(ディクショナリー)を使ってみよう!
それでは辞書型をUnityで使用してみましょう!
残念ながら辞書型はUnityエディターが対応していないためInspectorから設定できません。
エディター拡張を使用するとInspectorから設定できるようになりますが、こちらからそれを実装するか、Web上で公開されているものを使うなど、Unity以外の別のスクリプトが必要になります。
今回の記事では辞書型の使い方の簡単な一例としてサンプルコードをみてください。
サンプルコードを実行する際には次のメンバをInspectorから設定してください。
- Keysフィールド:辞書(_dictフィールド)に設定するキーの一覧。好きな数追加してください。
- Textフィールド:画面に表示するために使うTextMeshコンポーネントをアタッチしてください。
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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Sample : MonoBehaviour { Dictionary<string, int> _dict; public List<string> Keys; public string ShowKey; public TextMesh Text; void Start() { //辞書の初期化。InspectorでKeysに設定したキーを追加している。 _dict = new Dictionary<string, int>(); for(var i=0; i<Keys.Count; ++i) { _dict.Add(Keys[i], (i+1) * 100); } } void Update() { if(Text == null) return; //Textが設定されていなかったら何もしない。 //ShowKeyに設定されたキーが辞書にある場合はそのペアを、ない場合は何もないテキストを表示する。 if(_dict.ContainsKey(ShowKey)) { Text.text = $"{ShowKey} => {_dict[ShowKey]}"; } else { Text.text = "(none key...)"; } } } |
サンプルコードでは辞書型はプライベートなメンバフィールド(_dict)として定義しています。
Start
メソッドの中で辞書型をKeys
フィールドに設定されたキー値を使って初期化しています。
初期化後の辞書型の内容を確認するために、ShowKey
フィールドに設定されたキーが辞書にあるのかをUpdate
メソッド内でDictionary<TKey, TValue>.Contains
メソッドを使用して確認しています。
あった場合はそのキーと値をテキストに変換して画面に表示しています。ない場合はキーがないことを意味するテキストを表示しています。
まとめ
今回の記事では辞書型について解説してきました。
簡単にまとめると以下のようになります。
- 辞書型はキーとそれに対応する値のペアからなるコレクション。
- キーと値のペアはKeyValuePair<TKey, TValue>型として扱われている。
- 要素を追加する時はキーとそのペアとなる値指定する。
- 削除する時はキーのみでOK。
- 値にアクセスする時はそれに対応するキーを添字代わりに使用する。
- ループする時はforeach文を使う。
- キーのみの一覧を見る時はKeysを、値のみの一覧を見る時はValuesを使用する。
- 既にキーがある場合に追加しようとすると値が上書きされる。
それでは次の記事に行ってみましょう!
コメント