unity > array [ , ] > 同じコマンドへの異なる応答の実装 > List＜List＞ / Dictionary＜string, List＜string＞＞

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

helloというコマンドに対して、異なる応答を返すようにしたい。

Listで実装しようとしたら(おそらく)listは1つの要素しか使えないので、工夫が必要。

##try1 
とりあえずArray型に逃げた、ひよコードは以下。

```listTestScript.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // for List

public class listTestScript : MonoBehaviour {

	void Test_list_duplicate_registration() {
//		List<int> [] myList = new [2] List<int> ();
//		List<int> [] myList = new List<int> ()[2];

		string [,] strList = new string[3, 2];

		strList [0, 0] = "hello";
		strList [0, 1] = "hello, Mike";

		strList [1, 0] = "hello";
		strList [1, 1] = "tadano shikabane no youda";

		strList [2, 0] = "hello";
		strList [2, 1] = "This number is not currently registered";

		int idx;
		for (int loop=0; loop<10; loop++) {
			idx = Random.Range(0,3);
			Debug.Log(strList[idx,0] + " >> " + strList[idx,1]);
		}
	}

	void Start () {
		Test_list_duplicate_registration ();
	}	
}
```

![Main_unity_-_150915-dictionaryTest_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/fe125cd7-6f87-6637-3a0a-157ca5a52bff.jpeg)

##try2 (List＜List＞使用)

Listの中のList。まだ使い方がよくわかってないが、以下はできた。

```
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // for List

public class listTest : MonoBehaviour {

	void Test_list_duplicate_registration() {
		var ls = new List<List<int>> ();

		var inls1 = new List<int> ();
		inls1.Add (3);
		inls1.Add (1);
		inls1.Add (4);
		ls.Add (inls1);

		var inls2 = new List<int> ();
		inls2.Add (2);
		inls2.Add (7);
		inls2.Add (1);
		ls.Add (inls2);

		for (int oi=0; oi<2; oi++) {
			for (int idx=0; idx<3; idx++) {
				var x = ls [oi] [idx];
				Debug.Log ("" + idx.ToString () + ":" + x.ToString ());
			}
			Debug.Log("---");
		}
	}

	void Start () {
		Test_list_duplicate_registration ();
	}
	
}
```

```txt:結果
0:3
1:1
2:4
---
0:2
1:7
2:1
```

πとネイピア数の途中まで表示。

##try3 (Dictionary＜string, List＜string＞＞)

教えていただいた`List<List<int>>`をもとに、Dictionaryと組み合わせる方法をやってみた。

[v0.1 @ github](https://github.com/yasokada/unity-150915-dictionaryTest/releases/tag/v0.1)

```dicListTest.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // for List, Dictionary

public class dicListTest : MonoBehaviour {

	void displayAllElementWithKey(ref Dictionary<string, 
	       List<string>> myDic, string searchKey) {
		foreach(KeyValuePair<string, List<string>> pair in myDic) {
			if (pair.Key != searchKey) {
				continue;
			}
			Debug.Log("cmd:" + pair.Key.ToString());
			foreach(var element in pair.Value) {
				Debug.Log("res:" + element);
			}
		}
	}

	void Test_diclist() {
		Dictionary <string, List<string>> myDic 
			= new Dictionary<string, List<string>> ();
		string keystr;

		// command 1
		keystr = "hello";
		var res1ls = new List<string> ();
		res1ls.Add ("hello, Mike");
		res1ls.Add ("tadano shikabane no youda");
		res1ls.Add ("This number is not currently registered");
		myDic.Add (keystr, res1ls);

		// command 2 
		keystr = "Ca va bien?";
		var res2ls = new List<string> ();
		res2ls.Add ("Merci, beaucoup");
		res2ls.Add ("honjitsu wa sentenn nari");
		res2ls.Add ("Je ne peut pas parler Francaise.");
		myDic.Add (keystr, res2ls);

		displayAllElementWithKey (ref myDic, /* searchKey=*/"hello");
	}

	void Start () {
		Test_diclist ();
	}
	
}
```

![Main_unity_-_150915-dictionaryTest_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/eb006432-9b40-fa1e-48d9-c92eaaf4ee29.jpeg)

とりあえずhelloキーの全要素の出力まではできた。


##try4 (指定コマンドの応答をランダムに返す)

以下の関数を用意した。 searchKeyでmyDicを検索して、その中のListからランダムに返す。

[v0.2 @ github](https://github.com/yasokada/unity-150915-dictionaryTest/releases/tag/v0.2)

```csharp
	void findElementWithKey(
		ref Dictionary<string, List<string>> myDic, string searchKey) {

		List<string> resList;
		resList = myDic [searchKey];
		int pos = Random.Range (0, resList.Count);
		Debug.Log ("res:" + resList [pos]);
	}
```

以下は使用例

```csharp
		for (int loop=0; loop<10; loop++) {
			findElementWithKey (ref myDic, /* searchKey=*/"hello");
		}
```

結果

![dicList.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4aa26ea1-38b3-5139-fdc0-0ae538870d17.png)

ランダムに応答を返せている。