質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

5513閲覧

Dictionaryを使い配列を作る方法

SaharaDesert

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/08/24 17:32

編集2018/08/24 17:37

前提・実現したいこと

初心者なので色々アドバスください。
コレクション型のDictionaryを使い配列作っています。

Dictionaryの配列を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

1、System.NullReferenceException: Object reference not set to an instance of an object 2、NullReferenceException: Object reference not set to an instance of an object

該当のソースコード

C#

1 string[] KeyTable = new string[4] { "UP", "DOWN", "RIGHT", "LEFT" }; 2 int[,] ValueTable = new int[4, 4] { 3 {0,0,0,0}, 4 { 0,1,2,0}, 5 { 0,3,2,0}, 6 { 0,0,0,0}, 7 }; 8 9 Dictionary<string, int>[] move = new Dictionary<string, int>[4]; 10 //値の数 11 for (int i = 0; i < 4; i++) 12 { 13 //キーの数 14 for (int j = 0; j < 4; j++) 15 { 16 //Dictionaryにキーと値を入れる 17 move[i].Add(KeyTable[i], ValueTable[i, j]); 18 19 } 20 } 21

試したこと

moveの要素の削除

補足情報(FW/ツールのバージョンなど)

エラーの場所は、for文内のイカの場所です。

//Dictionaryにキーと値を入れる
move[i].Add(KeyTable[i], ValueTable[i, j]);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Dictionary自体のインスタンスが生成されていません。
以下のように値を入れる前に生成するようにしてください。

C#

1 for (int i = 0; i < 4; i++) 2 { 3 move[i] = new Dictionary<string, int>(); //これが必要 4 5 //キーの数 6 for (int j = 0; j < 4; j++) 7 { 8 //Dictionaryにキーと値を入れる 9 move[i].Add(KeyTable[i], ValueTable[i, j]); 10 11 } 12 }

投稿2018/08/24 17:46

f-miyu

総合スコア1625

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SaharaDesert

2018/08/24 18:09 編集

回答ありがとうございます。 実装してみましたら以下のエラーが出ました。 これは、どう直せばよいのでしょうか。 ArgumentException: An element with the same key already exists in the dictionary. /*変更後のソース*/ for (int i = 0; i < 4; i++) { move[i] = new Dictionary<string, int>(); //これが必要 //キーの数 for (int j = 0; j < 4; j++) { //Dictionaryにキーと値を入れる move[i].Add(KeyTable[i], ValueTable[i, j]); } }
f-miyu

2018/08/24 18:11

Addは同じキーを追加することはできません。 おそらく、KeyTable[i]ではなく、KeyTable[j]にするべきところだと思います。
SaharaDesert

2018/08/25 05:22

返信遅くなり申し訳ありません。 KeyTable[i]ではなく、KeyTable[j]にしましたらできました。 ありがとうございます。 完成したソース for (int i = 0; i < 4; i++) { move[i] = new Dictionary<string, int>(); //これが必要 //キーの数 for (int j = 0; j < 4; j++) { //Dictionaryにキーと値を入れる move[i].Add(KeyTable[j], ValueTable[i, j]); } }
guest

0

返信遅くなり申し訳ありません。
KeyTable[i]ではなく、KeyTable[j]にしましたらできました。
ありがとうございます。

完成したソース
for (int i = 0; i < 4; i++)
{
move[i] = new Dictionary<string, int>(); //これが必要

//キーの数
for (int j = 0; j < 4; j++)
{
//Dictionaryにキーと値を入れる
move[i].Add(KeyTable[j], ValueTable[i, j]);

}
}

投稿2018/08/25 05:19

編集2018/08/25 05:20
SaharaDesert

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

初期化リストなしのnew演算子によって作成された参照型の配列はnullで初期化されています。

よって

c#

1 Dictionary<string, int>[] move = new Dictionary<string, int>[4]; 2 //値の数 3 for (int i = 0; i < 4; i++) 4 { 5 // 空の辞書で初期化 6 move[i] = new Dictionary<string, int>(); 7 //キーの数 8 for (int j = 0; j < 4; j++) 9 { 10 //Dictionaryにキーと値を入れる 11 move[i].Add(KeyTable[i], ValueTable[i, j]); 12 13 } 14 }

とする必要があります。

投稿2018/08/24 17:56

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問