コガネブログ

平日更新を目標にUnityやC#、Visual Studioなどのゲーム開発アレコレを書いていきます

【C#】Dictionary型の変数定義が横に長くなるのが気になる

例えばアイコンの種類によってテクスチャ名を取得するなど
int型や列挙型をキーにして値を取得したい時は下記のようにDictionaryを使っていました

// アイコンの種類
public enum IconType
{
    SOLDIER,  // 王国兵士
    SORCERER, // 魔法使い
}

// アイコンごとのテクスチャ名を管理するテーブル
private static readonly Dictionary<IconType, string> mIconTextureNameTable = new Dictionary<IconType, string>
{
    { IconType.SOLDIER,  "Soldier.png"   }, 
    { IconType.SORCERER, "Sorcerer.png"  }, 
};

// 指定されたアイコンのテクスチャ名を返します
public static string GetTextureName(IconType iconType)
{
    return mIconTextureNameTable[iconType];
}

ただ、この書き方だとDictionary型の変数の定義が横に長くなることが気になっていました

private static readonly Dictionary<IconType, string> mIconTextureNameTable = new Dictionary<IconType, string>

改行を入れたとしても見慣れないから違和感・・・

private static readonly Dictionary<IconType, string> mIconTextureNameTable = 
    new Dictionary<IconType, string>

ということで、最近はint型や列挙型をキーにして値を取得したい時は下記のように書いています

// アイコンの種類
public enum IconType
{
    SOLDIER,  // 王国兵士
    SORCERER, // 魔法使い
}

// アイコンのデータ(読み取り専用)
public class IconData
{
    public IconType IconType         { get; private set; }
    public string   LargeTextureName { get; private set; }
    public string   SmallTextureName { get; private set; }

    public IconData(
        IconType iconType, 
        string   largeTextureName, 
        string   smallTextureName)
    {
        IconType         = iconType;
        LargeTextureName = largeTextureName;
        SmallTextureName = smallTextureName;
    }
}

// アイコンごとのデータを管理するテーブル
private static readonly IconData[] mIconDataTable = 
{
    new IconData(IconType.SOLDIER,  "Soldier64.png",  "Soldier32.png" ), 
    new IconData(IconType.SORCERER, "Sorcerer64.png", "Sorcerer32.png"), 
};

// 指定された種類のアイコンのデータを返します
public static IconData GetIconData(IconType iconType)
{
    return mIconDataTable.First(c => c.IconType == iconType);
    //return Array.Find(mIconDataTable, c => c.IconType == iconType);
}

LINQ to ObjectsのFirst関数や、ArrayクラスのFind関数を使って目的の値を取得します
こちらの書き方だとDictionary型ではなく配列でテーブルを用意できるので

private static readonly IconData[] mIconDataTable = 

変数の定義が横に長くなることはありません
あと、First関数やFind関数は条件文を自由に記述できるので
複数のキーから目的の値を取得する、値をもとにしてキーを取得するといったことも簡単に書けます

Dictionary型と比べると目的の値を取得するまでの速度は遅くなると思いますが
コードが綺麗に記述できるのでこちらの書き方が好きです

あとはこれをCSVやXMLからデータを読み込めるようにすると開発効率が上がるかなと