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

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

ただいまの
回答率

88.64%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 8,444

coco_

score 19

 前提・実現したいこと

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

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

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の場合,0199までであるため、最大地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フォームアプリケーション

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

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/18 11:34

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

    キャンセル

0

こんにちは。

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


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

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


の部分だとします。

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/18 11:38

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

    キャンセル

-1

KeisuuReader を直してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/16 07:34

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

    キャンセル

  • 2018/11/16 07:37

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

    キャンセル

  • 2018/11/18 11:38

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

    キャンセル

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

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る