(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

自動でソートされるSortedDictionaryと登録順が保証されindexでアクセス出来るOrderedDictionary【C#】


このエントリーをはてなブックマークに追加


はじめに

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}");
}
f:id:kan_kikuchi:20220224072046j:plain


その亜種(?)として自動でソートされる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}");
}
f:id:kan_kikuchi:20220224072147j:plain



登録順が保証され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]}");
f:id:kan_kikuchi:20220224075306j:plain


なお、一覧取得で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}");
//}
f:id:kan_kikuchi:20220224074637j:plain


ちなみに有志によるジェネリック版のOrderedDictionaryが公開されていたりもします。(未確認)