はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】Dictionary<TKey,TValue>(ディクショナリ)クラスについてかるくまとめてみた

はじめに

今回は「ハッシュテーブル」とよく呼ばれるDictionary<TKey,TValue>ジェネリッククラスについての記事になります!

「配列やリストと何が違うんだっけ?」という疑問を抱く人もいるかもしれませんが、一言で言うならキーとそれに対応する値を複数保持できることが配列やリストと最も異なる点でしょう。

そんなディクショナリの使い方をみていきましょう!

ディクショナリを使うために

ディクショナリを使うにはusing ディレクティブを用いて名前空間System.Collections.Genericを指定しましょう。

using System.Collections.Generic;

初期化の仕方

using UnityEngine;
using System.Collections.Generic;

public class Hoge: MonoBehaviour
{
    private void Start()
    {
        //Enemyの名前をキーに、対応する値を経験値にする
        var enemyDict = new Dictionary<string, int>
        {
            { "スライム", 10 },
            { "ももんじゃ", 20 },
            { "ドラキー", 30 },
            { "メタルスライム", 100 },
        };
    }
}

このようにキーと対応する値を初期化することができます。

また、型はintstringのみならず、クラスでも大丈夫です

using UnityEngine;
using System.Collections.Generic;

public class Enemy
{
    public string Name { get; set; }
    public int Hp { get; set; }
    public int Exp { get; set; }
}

public class Hoge: MonoBehaviour
{
    private void Start()
    {
        //Enemyの名前をキーに、対応する値を経験値にする
        var enemyDict = new Dictionary<string, Enemy>
        {
            { "スライム", new Enemy{ Name = "スライム", Hp = 5, Exp = 10 } },
            { "ももんじゃ", new Enemy{ Name = "ももんじゃ", Hp = 10, Exp = 20 } },
            { "ドラキー", new Enemy{ Name = "ドラキー", Hp = 20, Exp = 30 } },
            { "メタルスライム", new Enemy{ Name = "メタルスライム", Hp = 3, Exp = 100 } },
        };
    }
}

これでかなり使い勝手を良くすることができました。

要素を追加する

//上の例の場合
enemyDict["キメラ"] = 40;
enemyDict.Add("キメラ", 40);

//下の例の場合
enemyDict["キメラ"] = new Enemy { Name = "キメラ", Hp = 40, Exp = 40 };
enemyDict.Add("キメラ", new Enemy { Name = "キメラ", Hp = 40, Exp = 40 });

このように2種類の方法で要素の追加をできます。

要素を取り出す

Enemy slime = enemyDict["スライム"];

これで要素を取り出すことができますが、キーが存在しない場合には例外が発生します。
キーが存在するか調べてから実行したい場合はこのようにしましょう。

string key = "スライム";
if (enemyDict.ContainsKey(key))
{
    Enemy slime = enemyDict["スライム"];
}

要素を削除する

bool result = enemyDict.Remove("スライム");     //正常に削除されたらtrue, 指定したキーがないときはfalse

すべての要素を取り出す

foreach(KeyValuePair<string, Enemy> item in enemyDict)
{
    Debug.Log(item.Key + ": " + item.Value);
}

//このようにも書ける
foreach(var item in enemyDict)
{
    Debug.Log(item.Key + ": " + item.Value);
}

すべてのキーだけを取り出す

上のコードでもキーを取り出せますが、キーだけを取り出すこともできます。

foreach(var key in enemyDict.Keys)
{
    Debug.Log(key);
}

ただどうやら取り出す順番は決まっていないようです。
注意してください。

さいごに

ディクショナリについて軽くまとめてみました。
少しだけでも参考になれば幸いです!