none
Dictionary<string, object>型への変換に関しまして RRS feed

  • 質問

  • 初歩的なご質問ばかりさせていただいて申し訳ございません。

    List<Dictionary<string, object>> hogeList = new List<Dictionary<string, object>>();

    この「hogeList 」ですが、

    Dictionary<string, object>型に変換するのはどういうロジックを記載すれば良いでしょうか?

    恐れ入りますが、ご教授宜しくお願い致します。

    • 移動 佐伯玲 2013年2月5日 4:05 より適切なカテゴリへ
    2013年2月4日 11:58

回答

  • AListはあくまでList型あり、List型の持つContainsメソッドはKeyで比較するのではなく完全一致するものが含まれるかの判定で、目的が違います。Dictionary型の持つContains(正確にはContainsKey)は使えません。データ型を見直すか、ループを回して1つ1つ取り出してから比較するほかありません。

    • 回答としてマーク spiritlove 2013年2月6日 5:31
    2013年2月5日 8:46
  • まずは苦言。

    • 参照型の比較の挙動を勉強してください。
    • Dictionary<string, object> を頼らずに、独自のクラスを作ることを検討してください。
      このコードは型安全ではないので、同じキー名でまったく違う型が入っていてもコンパイル時に気づかず、実行時にたまに落ちる(例外が出る)ということになりかねません。(不安定なコードです)
    • コレクションの入れ子をうまく使いこなせていない状態では、もっと平易なコレクションにすることを考えた方がよいです。また問題にぶつかってコードが書けず、実装効率を落としますし、不具合を埋め込みやすくなり、品質が低下すると考えられるためです。
      List<Dictionary<string, object>> でうまく作れないなら、List<DataClass> みたいに自作クラスでシンプルにすればわかりやすいでしょう。(参照型の比較問題は残ります)

    次にいくつか、考え方のヒントを。

    • keys["Key"] で Key を取り出せるのでは。
    • AList をループで回して Key だけを取り出して List<string> でも作ると keys["Key"] と比較できるのでは。
    2013年2月5日 14:24
    モデレータ

すべての返信

  • 質問がWPFと無関係です。

    質問に対する回答としては、型が全く異なるため型変換できません。明らかに間違ったことをやろうとしているため、なぜ変換したいのか、その背景を説明した方がいいと思います。

    それとは別に先のスレッドでの質問はLINQを使った方がいいと思いました。その場合、Dictionary<string, object>にはならず、匿名型になります。

    2013年2月4日 12:05
  • 佐祐里様

    ご指摘ありがとうございます。

    仰る通りWPFには関係ない質問ですね。失礼いたしました。

    やろうとしている事はキャストに失敗するのは認識しているのですが、変換という言葉がふさわしくなかったかと思いますが、List<Dictionary<string, object>> 内のデータを

    Dictionary<string, object>にセットし直したいと言うべきでしょうか。

    他のDictionary<string, object>型のデータが保持しているKeyとList<Dictionary<string, object>> hogeList が保持しているKeyとを突き合わせし、ヒットすればValue値を

    別のDictionary<string, object>へAddしていきたいと考えていた背景が御座います。

    先のスレッドに対するご教授も有難うございます。

    2013年2月4日 12:25
  • 思い描いている範囲でいいのでコードにしてみてください。その上で、どの行でどんなエラーが出るか、どうなってほしいのか、それを書いてください。

    改めて説明された内容、それをそのままコードに書けば動くと思います。(説明の中で1ヶ所怪しい部分がありますが、きっとそこでエラーが発生するでしょうし、エラーメッセージからどう修正すればいいのかわかると思いますし。)

    2013年2月5日 0:24
  • こんにちは、spiritlove さん
    フォーラムオペレータの佐伯 玲 です。

    こちらのスレッドですが後ほどスレッドのカテゴリを「Visual C#」カテゴリ移動させて頂きました。

    また、既に解決済みではございますがひとつ前に投稿されていた以下のスレッドも同様だと思いましたので移動させて頂きました。

    List<Dictionary<string, object>> のSort処理に関しまして
    http://social.msdn.microsoft.com/Forums/ja-JP/wpfja/thread/1d7b4f2f-c764-4ba7-a66c-4b840ba4ae2d

    宜しくお願い致します。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレータ 佐伯 玲


    • 編集済み 佐伯玲 2013年2月5日 4:06 作業が完了したので
    2013年2月5日 2:47
  • 佐祐里様

    ご返信有難うございます。

    お言葉に甘えさせていただき、実現させたい事を記載させていただきます。

    HogeMainViewModel model = (HogeMainViewModel)this.ViewModel;

    List<Dictionary<string, object>> AList = new List<Dictionary<string, object>>();

    int dataCount = model.DataList.Count;       ← 「DataList」はList<Dictionary<string, object>> 型です。

    foreach ループ
    {

        Dictionary<string, object> dic = new Dictionary<string, object>();
        dic["Key"] = xxxxx.Key;
        dic["ColumnIndex"] = xxxxx.GetValue("ColumnIndex");
        dic["ColumnField"] = xxxxx.GetValue("ColumnField");
        AList .Add(dic);

    }

    if (dataCount > 0)
    {
        foreach (Dictionary<string, object> keys in model.DataList)
        {

            foreach (string key in keys.Keys)
            {
                ※当初はこの中でmodel.DataListのKey値がAListに保持しているKey値にあれば、そのKey値とmodel.DataListのヒットしたKey値における値を

                   Dictionary<string, object>型の新しい領域にセットしたいと考えていました。

            }
        }
    }

    したい事はmodel.DataListのKey値とAListのKey値が一緒のものを別のDictionary<string, object>型の領域にkey情報と値を格納したい考えています。

    どのようにすれば実現できますでしょうか?

    2013年2月5日 8:02
  • そこをコードにしてみてください。
    2013年2月5日 8:15
  • 佐祐里様

    >そこをコードにしてみてください。

    そこがどうしたら良いのか分からないのでご質問させていただいた次第です。

    List<Dictionary<string, object>> 型のAlistのKeyを例えば以下のような形にしてもロジックエラーとなるので、どう対処して良いものか教えていただければ幸いです。

    if AList.Contains(key)

    {

    }

    2013年2月5日 8:23
  • AListはあくまでList型あり、List型の持つContainsメソッドはKeyで比較するのではなく完全一致するものが含まれるかの判定で、目的が違います。Dictionary型の持つContains(正確にはContainsKey)は使えません。データ型を見直すか、ループを回して1つ1つ取り出してから比較するほかありません。

    • 回答としてマーク spiritlove 2013年2月6日 5:31
    2013年2月5日 8:46
  • 佐祐里様

    そうなんですね!初心者ですみません。勉強になります。

    ループを回して1つ1つ取り出してから比較するというのはどんな感じになるんでしょうか?

    ロジック例みたいなのをご教授いただけると幸いです。

    2013年2月5日 10:29
  • まずは苦言。

    • 参照型の比較の挙動を勉強してください。
    • Dictionary<string, object> を頼らずに、独自のクラスを作ることを検討してください。
      このコードは型安全ではないので、同じキー名でまったく違う型が入っていてもコンパイル時に気づかず、実行時にたまに落ちる(例外が出る)ということになりかねません。(不安定なコードです)
    • コレクションの入れ子をうまく使いこなせていない状態では、もっと平易なコレクションにすることを考えた方がよいです。また問題にぶつかってコードが書けず、実装効率を落としますし、不具合を埋め込みやすくなり、品質が低下すると考えられるためです。
      List<Dictionary<string, object>> でうまく作れないなら、List<DataClass> みたいに自作クラスでシンプルにすればわかりやすいでしょう。(参照型の比較問題は残ります)

    次にいくつか、考え方のヒントを。

    • keys["Key"] で Key を取り出せるのでは。
    • AList をループで回して Key だけを取り出して List<string> でも作ると keys["Key"] と比較できるのでは。
    2013年2月5日 14:24
    モデレータ
  • Azulean様

    ご指導及び、ご教授有藤御座いました。

    ご教授いただきましたように、List<DataClass>を使う事で処理もシンプルになり、そこからしたかった事が実現出来る様になりました。

    こういうやり方もあるんですね!また一つ勉強させていただきました。

    2013年2月6日 4:47
  • 先のスレッドでその提案をしているんですが…。
    2013年2月6日 5:28
  • 佐祐里様

    すみません。

    記載していただいた事が自分の中でイメージ出来ずにいました。

    2013年2月6日 5:32
  • 具体的にソースコードを提示していますがどこがわからなかったのでしょうか? (このスレッドではなく先のスレッドに返信ください。)
    2013年2月6日 8:38
  • 佐祐里様

    先のスレッドでロジックが・・・とお話しいただいておりますが、先のスレッドは以下のお話で頂戴しましたが、ロジックとはどこに記載されていますでしょうか?リンクか何かですか?

    AListはあくまでList型あり、List型の持つContainsメソッドはKeyで比較するのではなく完全一致するものが含まれるかの判定で、目的が違います。Dictionary型の持つContains(正確にはContainsKey)は使えません。データ型を見直すか、ループを回して1つ1つ取り出してから比較するほかありません。

    2013年2月6日 8:48
  • 「先のスレッド」とは「List<Dictionary<string, object>> のSort処理に関しまして」のことですが。
    2013年2月6日 12:43
  • 佐祐里様

    >「先のスレッド」とは「List<Dictionary<string, object>> のSort処理に関しまして」のことですが。。

    こちらのスレッドの事でしたか、すみません。

    先ほど確認させていただきました。

    ご返信は先のスレッドの方にもさせていただいております。

    有難うございました!

    2013年2月7日 11:59