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

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

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

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

Q&A

解決済

3回答

8045閲覧

エラーの文章がどこを直せばいいのか分かりません

coco_

総合スコア19

C#

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

0グッド

0クリップ

投稿2018/11/15 14:31

編集2018/11/15 19:20

前提・実現したいこと

エラーの文章がどこを直せばいいのか分かりません。
どなたか分かる方で直すところを教えてください。お願いします。

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

double z= の式で下記のエラーが出ました。 System.Collections.Generic.KeyNotFoundException: '指定されたキーはディレクトリ内に存在しませんでした。'

該当のソースコード

namespace WindowsFormsApp16 { public partial class Form1 : Form { keisuu = new Dictionary<string, Dictionary<string, Dictionary<string, double>>>(); // xxxxx1 = 基本色、全色相、活気、評価値の平均 keisuu["xxx1"] = new Dictionary<string, Dictionary<string, double>>(); keisuu["xxx1"]["a0"] = new Dictionary<string, double>(); keisuu["xxx1"]["a0"]["B"] = -0.138; keisuu["xxx1"]["a0"]["G"] = -0.137; keisuu["xxx1"]["a0"]["P"] = -0.134; keisuu["xxx1"]["a0"]["R"] = -0.135; keisuu["xxx1"]["a0"]["Y"] = -0.137;         . . . keisuu["xxx1"]["a5"] = new Dictionary<string, double>(); keisuu["xxx1"]["a5"]["B"] = 0.013; keisuu["xxx1"]["a5"]["G"] = 0.008; keisuu["xxx1"]["a5"]["P"] = 0.017; keisuu["xxx1"]["a5"]["R"] = 0.007; keisuu["xxx1"]["a5"]["Y"] = 0.010; //xxx2 = 基本色、全色相、落ち着き、評価値の平均 keisuu["xxx2"] = new Dictionary<string, Dictionary<string, double>>(); keisuu["xxx2"]["a0"] = new Dictionary<string, double>(); keisuu["xxx2"]["a0"]["B"] = 0.268; keisuu["xxx2"]["a0"]["G"] = 0.267; keisuu["xxx2"]["a0"]["P"] = 0.265; keisuu["xxx2"]["a0"]["R"] = 0.251; keisuu["xxx2"]["a0"]["Y"] = 0.258; . . . keisuu["xxx2"]["a5"] = new Dictionary<string, double>(); keisuu["xxx2"]["a5"]["B"] = 0.003; keisuu["xxx2"]["a5"]["G"] = -0.020; keisuu["xxx2"]["a5"]["P"] = 0.010; keisuu["xxx2"]["a5"]["R"] = -0.017; keisuu["xxx2"]["a5"]["Y"] = -0.028; // xxx3 = 強調色、全色相、活気、評価値の平均 keisuu["xxx3"] = new Dictionary<string, Dictionary<string, double>>(); keisuu["xxx3"]["a0"] = new Dictionary<string, double>(); keisuu["xxx3"]["a0"]["B"] = 0.044; keisuu["xxx3"]["a0"]["G"] = 0.043; keisuu["xxx3"]["a0"]["P"] = 0.047; keisuu["xxx3"]["a0"]["R"] = 0.047; keisuu["xxx3"]["a0"]["Y"] = 0.043; . . . keisuu["xxx3"]["a5"] = new Dictionary<string, double>(); keisuu["xxx3"]["a5"]["B"] = 0.011; keisuu["xxx3"]["a5"]["G"] = 0.007; keisuu["xxx3"]["a5"]["P"] = 0.007; keisuu["xxx3"]["a5"]["R"] = 0.003; keisuu["xxx3"]["a5"]["Y"] = 0.006; // xxx4 = 強調色、全色相、落ち着き、評価値の平均 keisuu["xxx4"] = new Dictionary<string, Dictionary<string, double>>(); keisuu["xxx4"]["a0"] = new Dictionary<string, double>(); keisuu["xxx4"]["a0"]["B"] = 0.426; keisuu["xxx4"]["a0"]["G"] = 0.427; keisuu["xxx4"]["a0"]["P"] = 0.415; keisuu["xxx4"]["a0"]["R"] = 0.412; keisuu["xxx4"]["a0"]["Y"] = 0.417; . . . keisuu["xxx4"]["a5"] = new Dictionary<string, double>(); keisuu["xxx4"]["a5"]["B"] = 0.001; keisuu["xxx4"]["a5"]["G"] = -0.017; keisuu["xxx4"]["a5"]["P"] = -0.004; keisuu["xxx4"]["a5"]["R"] = -0.004; keisuu["xxx4"]["a5"]["Y"] = -0.014; // 文字列定義している場所は変数に入れて使える。 /* string xxx = "xxx1"; string tarColor ="B"; double z = keisuu[xxx]["a0"][tarColor] + (keisuu[xxx]["a1"][tarColor] * x) + (keisuu[xxx]["a2"][tarColor] * y) + (keisuu[xxx]["a3"][tarColor] * x * x) + (keisuu[xxx]["a4"][tarColor] * x * y) + (keisuu[xxx]["a5"][tarColor] * y * y); */ } private void button1_Click(object sender, EventArgs e) { // Retrieve the image. Bitmap image1 = new Bitmap(@"C:\Users\peanuts\Source\Repos\WindowsFormsApp12\WindowsFormsApp12\Resources\blue.png"); //Bitmap image1 = new Bitmap(MAXLINE + 1, MAXLINE +1); // サイズはとても重要(200だったら、201である必要がある) int CELL_CNT_x = 100; // 座標1セル当たり100個必要 int CELL_CNT_y = 100; // 座標1セル当たり100個必要 int BASELINE_x = image1.Width / CELL_CNT_x + 1; // x軸の最大の長さを100等分する int BASELINE_y = image1.Height / CELL_CNT_y; // y軸の最大の長さを100等分する int x, y; string keisuuType = "kkk1"; string kanten1 = "xxx1"; string kanten2 = "xxx2"; string tarColor = "B"; string selectedkeisuutype = (comboBoxkeisuuType.SelectedItem.ToString()); string selectedtarColor = (comboBox1.SelectedItem.ToString()); if ("基本色" == selectedkeisuutype) { keisuuType = "kkk1"; kanten1 = "xxx1"; kanten2 = "xxx2"; } else if ("強調色" == selectedkeisuutype) { keisuuType = "kkk2"; kanten1 = "xxx3"; kanten2 = "xxx4"; } if ("青" == selectedtarColor) { tarColor = "B"; } else if ("緑" == selectedtarColor) { tarColor = "G"; } else if ("紫" == selectedtarColor) { tarColor = "P"; } else if ("赤" == selectedtarColor) { tarColor = "R"; } else if ("黄" == selectedtarColor) { tarColor = "Y"; } var graphics = Graphics.FromImage(image1); for (x = 0; x <= CELL_CNT_x; x++) { for (y = 0; y <= CELL_CNT_y; y++) { //float hue = pixelColor.GetHue(); // 色相 //float saturation = pixelColor.GetSaturation(); // 彩度を取得 //float brightness = pixelColor.GetBrightness(); // 明度を取得 if (IsDraw(tarColor, kanten1, kanten2, keisuuType, x, y) == true) { int drawX = x * BASELINE_x; // 400 int drawY = ReviewGuiY(y * BASELINE_y, image1.Height - 1); // サイズ200の場合,0~199までであるため、最大地199 //image1.SetPixel(drawX, drawY, Color.Red); graphics.FillEllipse(new SolidBrush(Color.Red), drawX, drawY, BASELINE_x, BASELINE_y); // 塗りつぶす } } } // Set the PictureBox to display the image. pictureBox1.Image = image1; } private int ReviewGuiY(int y, int maxY) { return maxY - y; } private bool IsDraw(string tarColor, string kanten1, string kanten2, string keisuuType, float y, float x) { double m, n; m = double.Parse(textBox1.Text); n = double.Parse(textBox2.Text); x = x / 10; y = y / 10; double h = m; // 刻み値 double j = n; // 余り範囲 ** // double z= の式でエラーが出ました。 double z = keisuu[keisuuType][kanten1]["a0"][tarColor] + (keisuu[keisuuType][kanten1]["a1"][tarColor] * x) + (keisuu[keisuuType][kanten1]["a2"][tarColor] * y) + (keisuu[keisuuType][kanten1]["a3"][tarColor] * x * x) + (keisuu[keisuuType][kanten1]["a4"][tarColor] * x * y) + (keisuu[keisuuType][kanten1]["a5"][tarColor] * y * y); ** double z1 = keisuu[keisuuType][kanten2]["a0"][tarColor] + (keisuu[keisuuType][kanten2]["a1"][tarColor] * x) + (keisuu[keisuuType][kanten2]["a2"][tarColor] * y) + (keisuu[keisuuType][kanten2]["a3"][tarColor] * x * x) + (keisuu[keisuuType][kanten2]["a4"][tarColor] * x * y) + (keisuu[keisuuType][kanten2]["a5"][tarColor] * y * y); double z2 = z - z1; double dAbs = System.Math.Abs(z2); //zの絶対値取得 if (dAbs % h <= j) { return true; // 何かの条件による計算結果の結果、描画条件を満たした。 } else { return false; // 何かの条件による計算結果の結果、描画上限を満たさなかった。 } } } }

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

VisualStudio 2017 C# windowsフォームアプリケーション

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

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

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

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

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

guest

回答3

0

ベストアンサー

変数 keisuu の定義を間違えているか、使い方を間違えているためにエラーが発生しています。

keisuu = new Dictionary<string, Dictionary<string, Dictionary<string, double>>>();

と定義されていますから、keisuuは、辞書(Dictionary<string, double>)の辞書(キーはString)の辞書(キーはString)です(3重の辞書)。

そうすると、
keisuu[一番外側の辞書のキー文字列]は、辞書(Dictionary<string, double>)の辞書(キーはString)、
keisuu[一番外側の辞書のキー文字列][外側から2番目の辞書のキー文字列]は、辞書(Dictionary<string, double>)、
keisuu[一番外側の辞書のキー文字列][外側から2番目の辞書のキー文字列][一番内側の辞書のキー文字列]は、doubleの値
となります。

** // double z= の式でエラーが出ました。 double z = keisuu[keisuuType][kanten1]["a0"][tarColor]

ところが、エラーが発生しているコードを見ると、keisuuに4つのキーがつけられています。
上で説明したように、keisuu[keisuuType][kanten1]["a0"]は、keisuu[一番外側の辞書のキー文字列][外側から2番目の辞書のキー文字列][一番内側の辞書のキー文字列]なのでdoubleの値です。

つまり、double z = doubleの値[tarColor] という無理な事をするコードになっているので、エラーが発生したのです。

==
まずは、落ち着いて、何がしたかったのかを良く考えなおして下さい。

そして、
・keisuuを4重の辞書として定義する(keisuu[keisuuType][kanten1]["a0"][tarColor]という使い方のほうが正しいと考える)か、
・keisuuの使い方を"keisuu[keisuuType][kanten1]["a0"]"のようにキーが3つ以内になるようにするか(keisuuを3重の辞書として定義しているのは正しいと考える)か、
を判断して、プログラムの修正をしてください。

投稿2018/11/16 02:16

coco_bauer

総合スコア6915

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

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

coco_

2018/11/18 02:34

dictionaryクラスのキーを一つ減らして、ご指摘していただいた通り、キーが三つ以内になるように修正したらうまくいきました。ありがとうございました!
guest

0

こんにちは。

最低でもコンパイル通るものじゃないと回答のしようがないんですが。
デバッグ実行でエラー発生時の変数の中身を確認することをお勧めします。


以下役に立たないと思われる解答:
とりあえずアクセスしたいものが

csharp

1keisuu["xxx1"]["a0"]["B"] = -0.138;

の部分だとします。

変数の中身がそれぞれkeisuuType = "kkk1"; kanten1 = "xxx1"; kanten2 = "xxx2"; tarColor = "B";だとすると、あなたがアクセスしているのは、

csharp

1** // double z= の式でエラーが出ました。 2double z = keisuu["kkk1"]["xxx1"]["a0"]["B"] // "xxx1"が入っているところに"kkk1"でアクセスしてるからアウト

それ以前にそもそもコンパイル通らないですねこれは。なんと言っても型が違う。

投稿2018/11/15 22:39

tamoto

総合スコア4105

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

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

coco_

2018/11/18 02:38

デバックでキーに入っていいる文字列を確認したところ、ちゃんとそれぞれのkeisuuにアクセス出来ていました。dictionaryクラスのキーを一つ減らしたらうまくいきました。とても参考になる回答ありがとうございました!
guest

0

KeisuuReader を直してください。

投稿2018/11/15 14:39

Zuishin

総合スコア28660

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

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

coco_

2018/11/15 19:21

KeisuuReaderでファイル読み込みではなく、dictionaryクラスを表示させたのですが変わりませんでした。他に理由分かりますか?
Zuishin

2018/11/15 22:17

原因はそこなので他と言われても困ります。
YAmaGNZ

2018/11/15 22:27 編集

メッセージの”ディレクトリ”って言葉に惑わされているのでは? KeyNotFoundExceptionで調べればいいかと 日本語のメッセージの方は誤訳ですね。 正しくは”指定されたキーはディクショナリ内に存在しませんでした。”かと
Zuishin

2018/11/15 22:34

あれ? 通知が無かったのか気づかなかっただけなのか、質問が書き換えられているのに今気づきました。 KeyNotFoundException は Dictionary の中にそのキーが無かった時に出る例外です。 keisuu[keisuuType] があるかどうか調べてみてください。
Zuishin

2018/11/15 22:37

YAmaGNZ さんフォローありがとうございます。ディレクトリという言葉も気づきませんでしたが、おっしゃる通りディクショナリでしょうね。
coco_

2018/11/18 02:38

解決しました。回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問