はじめに
C#にはKeyとValueをセットで登録してデータを保持するDictionaryがありますが、
(※Unity上で動かしているので、ログの表示にDebug.Logを使っています。)
//Dictionary作成 var dictionary = new Dictionary<string, int>() { {"Key1", -5}, {"Key2", 8}, {"Key3", 100}, }; //内容を一覧表示 foreach (var pair in dictionary) { Debug.Log($"Key {pair.Key} : Value {pair.Value}"); }
その亜種(?)として自動でソートされるSortedDictionaryや
登録順が保証されindexでアクセス出来るOrderedDictionaryもあります。
と言う事で今回はその2つの紹介記事です!
自動でソートされるSortedDictionary
まず自動でソートされるSortedDictionaryですが、
Dictionaryと同じ要領で使うだけでKeyを基準に常にソートされた状態になります。
//SortedDictionary作成 var dictionary = new SortedDictionary<string, int>() { {"Key2", 8}, {"Key1", -5}, {"Key3", 100}, }; //内容を一覧表示 foreach (var pair in dictionary) { Debug.Log($"Key {pair.Key} : Value {pair.Value}"); }
登録順が保証されindexでアクセス出来るOrderedDictionary
次に登録順が保証されindexでアクセス出来るOrderedDictionaryですが、
まずジェネリックになっていないのでKeyやValueはobjectになります。
ただし、基本的な使い方はDictionaryと同じですし、
登録順が保証されているのでindexでもアクセス可能です。
using System.Collections.Specialized; //OrderedDictionaryを使うのに必要
//OrderedDictionary作成(ジェネリックには出来ず、KeyもValueもobject) var dictionary = new OrderedDictionary() { {"Key2", 8}, {"Key1", -5}, {"Key3", 100}, }; //ValueをKeyとIndexそれぞれで取得 Debug.Log($"{dictionary["Key2"]}, {dictionary[0]}");
なお、一覧取得でforeachを使う時はvarを使ってしまうとobjectになってしまうので、
DictionaryEntryを指定する必要がある点には注意が必要です。
//OrderedDictionary作成 var dictionary = new OrderedDictionary() { {"Key2", 8}, {"Key1", -5}, {"Key3", 100}, }; //内容を一覧表示 foreach (DictionaryEntry pair in dictionary) { Debug.Log($"Key {pair.Key} : Value {pair.Value}"); } //↓だとKeyとValueが取得出来ずエラー //foreach (var pair in dictionary) { // Debug.Log($"Key {pair.Key} : Value {pair.Value}"); //}
ちなみに有志によるジェネリック版のOrderedDictionaryが公開されていたりもします。(未確認)