Dictionaryとは、連想配列。
基本的なことは他サイトで解説されているので、そちらもご参照ください(いきなり他力)
参考:Samurai Engineer
ここでは無駄な説明を省き、
ゲーム開発で確認したり、即使いやすいようにコードをまとめました。
もちろん、初心者の方もわかりやすく目指しました。
なので、まずは簡単な解説から・・・
基本として、Dictionaryでは、要素、Key、Valueという情報を扱います。
Dictionaryという配列に、要素(情報)を格納していきます。
(必要なときに要素を取り出して使ったりします)
また、要素は、KeyとValueがセットで構成されます。
とりあえず、この概念さえ抑えておけばOK!
実際のゲームでの使い道としては・・・
複数プレイヤーで競うゲームにおいて、
1プレイヤーにつき、1つの要素。
そのプレイヤー名をKey、そのプレイヤーの得点をValueにします。
それら情報を持つ要素を、Dictionaryに格納します。
Dictionaryに格納することによって、
Valueの高い順に要素の順を並べ替えたり、検索をかけることができます。
例えば、
最もValue(得点)の大きい要素を検索
→そのKey(プレイヤー名)
というように取得して、ゲームの勝者を決めることができます。
私のリリースしているゲームもそれを駆使して、勝者を決めてます^^
なので、Dictionaryを使いこなすことは、
ゲームを成立させるのにとても重要です!
Dictionaryを扱うためのコードは覚えきれないので、
本記事は、ゲーム開発の備忘録として、重宝していただければ幸いです!
1. Dictionaryを扱う宣言
Dictionaryの連想配列を使う場合、宣言をする必要があります。
実際の例文↓
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; public class DictionaryTestt : MonoBehaviour { Dictionary<string,int> dictionary = new Dictionary<string,int>(); void Start() { } }
<宣言する構文>
Dictionary<Key型名, Value型名> Dictionary名
= new Dictionary<Key型名, Value型名>()
例文では、Key型名をstring(文字列)、Value型名をint(整数)のDictionaryを宣言しています。
そして、
Dictionaryを扱うのに、
using System.Collections.Generic;
Dictinaryの要素を並べ変えたりするのに、
using System.Linq;
を記述する必要があるので忘れないように。
2.要素に対する処理
要素の追加
dictionary.Add("Key型名", "Value型名");
要素の削除
・特定の要素の削除
Dictionaryでは、要素は必ずKeyをもつので、Keyを指定した上で削除します。
Keyによる扱いにて、特定の要素の削除は記載します。
ちなみにListの場合は、□番目の要素として削除します。
宣言
List<string> list = new List<string>( a, b, c);
削除処理
list.RemoveAt(2); ←bの要素が削除される
参考:samurai engineer
・全ての要素を削除
dictionary.Clear();
要素数の取得
Dictionaryに格納している要素数を取得する場合
int itemNum = dictionary.Count;
整数なので、intの変数に代入します。
各要素に処理を行う(foreach)
・Dictionaryがもつ全要素のKeyとValueを出力させる場合
参考:コガネブログ
foreach(var item in dictionary)
{
Debug.Log(item.Key);
Debug.Log(item.Value);
}
2.キーKeyに対する処理
Key指定の要素の取得
aというKeyの要素を取得する場合
var item = dictionary.FirstOrDefault( c => c.Key == "a" );
Key指定の要素削除
aというKeyの要素を削除する場合
dictionary.Remove("a");
Key指定のValue取得
aというKeyのValueを取得し、aValueに代入する場合
var aValue = dictionary["a"];
Keyの順に要素を並び替え
前述の通り、Dictionaryの連想配列でソート(並び替え)機能を使う場合、
using system.Linqを使う必要があります。
参考:C#の連想配列(個人Blog)
・昇順(1,2.. または a,b..)
var sorted = dictionary.OrderBy((x) => x.Key);
・降順(3,2.. または c,b..)
var sorted = dictionary.OrderByDescending((x) => x.Key);
この処理の結果、Dictionaryの並べ替えを行なった情報は、
sortedというDictironaryとして生成することになります。
この機能は、ゲームにおいて、プレイヤーの順位を示す際に利用できます。
もし1位だけを取得し、示したいなら、
Valueの最も大きい要素(のKey)を取得する処理で済みます^^
それはValueの項で説明します。
最も大きいKeyのValueを取得
・Keyの降順に並び替えたDictionaryの最初の要素のValueを取得する方法
上記のように、Keyの降順に並べ替えを行なったなら、
その新たなDictinaryのsortedに対して、最初の要素およびValueを取得します。
参考:コガネブログ
var item = sorted.FirstOrDefault();
Debug.Log(item.Value);
・Dictionaryの最も大きいKeyを取得し、そのValueを取得する方法
シンプルなこちらの方法もご検討あれ。
var maxKey = dictionary.Keys.Max();
var maxKeyValue = dictionary[maxKey]
Debug.Log(maxKeyValue);
指定したKeyのValue変更
aというKeyのValue(int型)を100に変更する場合
dictionary["a"] = 100;
指定したKeyの有無の確認
aというKeyの有無を確認する場合
*ConstrainKey()は、有る場合、trueを返します。
if ( dictionary.ContainsKey( "a" ) )
{
Debug.Log( "aあり" );
}
3.値Valueに対する処理
処理によっては、KeyのときのようにValueに対してアクセスできないものも中にはあります。
しかし、ステップを踏めば、ValueからKeyにアクセスできます。
つまり、ステップを踏めば、KeyとValue、双方向のアクセスが可能ということです。
(これがDictionaryの良さだと個人的に思ってます^^)
Value指定の要素の取得
10というint型Valueの要素をitemとして取得する場合
参考:コガネブログ
var item = dictionary.FirstOrDefault( c => c.Value == 10 );
Keyの場合と同じですね(c.Keyがc.Valueになっただけ)。
Value指定の要素削除
Dictionaryは特定の要素を指定して、削除することはできませんでしたね。
その場合は、Keyを指定する必要があります。
なので、いったん上記のようにValueから要素を取得したら、
そのKeyを指定して削除します。
dictionary.Remove(item.Key);
Value指定のKey取得
上記でValueから要素を取得したら、そのKeyは取得したも同然です。
var 10Key = item.Key;
まとめて、このように記述もできます。
var 10Key = dictionary.FirstOrDefault( c => c.Value == 10 ).Key;
Valueの順に要素を並び替え
並び変えは、Keyの時と同様です。
・昇順(1,2.. または a,b..)
var sorted = dictinary.OrderBy((x) => x.Value);
・降順(3,2.. または c,b..)
var sorted = dictinary.OrderByDescending((x) => x.Value);
指定したValueのKey変更
DictionaryのKeyは変更できません。
そのKeyの要素を削除し、新しく追加するしかなさそうです。。。
指定したValueの有無の確認
10というValueの有無を確認する場合
*ConstrainValue()は、有る場合、trueを返します。
if ( dictionary.ContainsValue( 10 ) )
{
Debug.Log( "10あり" );
}
その他エラーを回避するための条件分岐
Keyが重複しないようにする方法
後日追記予定・・・
独学でプログラミングに挑戦するなら・・・
Udemyで学ぶのがおすすめ