2014年9月13日土曜日

配列色々

参考資料 1を読んで、なるほどと思いつつも、私は List<T> を余り使っていないのだった。反論でも何でもなく、ただ単に要素数が固定のものばかりを扱っているだけだけなので、可変のものを扱う必要があれば使うだろう。ArrayList を使わないのも同意する。

今、制作中のゲームでは type[] と SortedDictionary<TKey, TValue> をよく使う。それらの使い分けは、要素数が固定かつキーが整数でも分かりやすいもの、スコープが狭く他から参照しないもの、インスペクターから値を入れたいものには type[] を使い、それ以外には SortedDictionary<TKey, TValue> を使うようにしている。キーが整数でも分かりやすいというのは、格納した値を参照するために type[0], type[1], ... と書くときに適切なキーがわかるということだ。

キーが整数でも適切なキーが分かりやすい例は座標の履歴を格納する場合で、数字の若い方が新しいのか古いのかの流儀はあるにしても自分の分かりやすい方にすればいい。なお、私は若い方が新しい流儀である。

他方、キーが整数だと適切なキーが分かりにくい例は東西南北に対応するベクトルを配列に格納する場合だ。私がやるとすれば北を 0、東を 1、南を 2、西を 3 にするだろうが、読者の皆さん (誰?) も果たして同じだろうか。同じだったらボクと握手。

キーに凝るのは余所から参照するときにわかりやすくするためなので、スコープが狭く他から参照しないものにまで凝ったキーを付ける必要はない。もう一つの理由の、インスペクターから値を入れたいというのは、List<T>, SortedList<T>, Dictionary<T>, SortedDictionary<T> ではできないからという消極的な理由だ。

なぜ Dictionary<TKey, TValue> でなく SortedDictionary<TKey, TValue> なのかは参考資料 2 が詳しいのでそちらをご参照下さい。

さて、SortedDictionary<TKey, TValue> では型で束縛されるが好きなキーが使えるので分かりやすいキーにしやすい。キーを string にすれば制限はほとんどなくなるが、補完が効かないので私は要素数が固定の場合はキーを Enum にする。いやぁ、補完が効くって素晴らしい。

あ、書き忘れていたが、SortedDictionary<TKey, TValue> や Dictionary<TKey, TValue>を使うには以下を書いて名前解決しておくとよい。

using System.Collections.Generic;

参考資料

  1. Myouji. "[Unity] Array/配列的な奴らとの付き合い方-type[]とかListとか". myoujing!!. 2014-08-24. http://myoujing.wpblog.jp/2014/08/874/, (参照 2014-09-11)
  2. Vladimir Bodurov. "IDictionary Options - Performance Test - SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable". Vladimir Blog. 2007-12-24. http://blog.bodurov.com/Performance-SortedList-SortedDictionary-Dictionary-Hashtable/, (参照 2014-09-11)

0 件のコメント:

コメントを投稿