トップ回答者
Dictionary<string, object>型への変換に関しまして

質問
回答
-
AListはあくまでList型あり、List型の持つContainsメソッドはKeyで比較するのではなく完全一致するものが含まれるかの判定で、目的が違います。Dictionary型の持つContains(正確にはContainsKey)は使えません。データ型を見直すか、ループを回して1つ1つ取り出してから比較するほかありません。
- 回答としてマーク spiritlove 2013年2月6日 5:31
-
まずは苦言。
- 参照型の比較の挙動を勉強してください。
- Dictionary<string, object> を頼らずに、独自のクラスを作ることを検討してください。
このコードは型安全ではないので、同じキー名でまったく違う型が入っていてもコンパイル時に気づかず、実行時にたまに落ちる(例外が出る)ということになりかねません。(不安定なコードです) - コレクションの入れ子をうまく使いこなせていない状態では、もっと平易なコレクションにすることを考えた方がよいです。また問題にぶつかってコードが書けず、実装効率を落としますし、不具合を埋め込みやすくなり、品質が低下すると考えられるためです。
List<Dictionary<string, object>> でうまく作れないなら、List<DataClass> みたいに自作クラスでシンプルにすればわかりやすいでしょう。(参照型の比較問題は残ります)
次にいくつか、考え方のヒントを。
- keys["Key"] で Key を取り出せるのでは。
- AList をループで回して Key だけを取り出して List<string> でも作ると keys["Key"] と比較できるのでは。
- 編集済み AzuleanMVP, Moderator 2013年2月5日 14:26
- 回答としてマーク spiritlove 2013年2月6日 4:48
すべての返信
-
佐祐里様
ご指摘ありがとうございます。
仰る通りWPFには関係ない質問ですね。失礼いたしました。
やろうとしている事はキャストに失敗するのは認識しているのですが、変換という言葉がふさわしくなかったかと思いますが、List<Dictionary<string, object>> 内のデータを
Dictionary<string, object>にセットし直したいと言うべきでしょうか。
他のDictionary<string, object>型のデータが保持しているKeyとList<Dictionary<string, object>> hogeList が保持しているKeyとを突き合わせし、ヒットすればValue値を
別のDictionary<string, object>へAddしていきたいと考えていた背景が御座います。
先のスレッドに対するご教授も有難うございます。
-
こんにちは、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 作業が完了したので
-
佐祐里様
ご返信有難うございます。
お言葉に甘えさせていただき、実現させたい事を記載させていただきます。
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情報と値を格納したい考えています。
どのようにすれば実現できますでしょうか?
-
AListはあくまでList型あり、List型の持つContainsメソッドはKeyで比較するのではなく完全一致するものが含まれるかの判定で、目的が違います。Dictionary型の持つContains(正確にはContainsKey)は使えません。データ型を見直すか、ループを回して1つ1つ取り出してから比較するほかありません。
- 回答としてマーク spiritlove 2013年2月6日 5:31
-
まずは苦言。
- 参照型の比較の挙動を勉強してください。
- Dictionary<string, object> を頼らずに、独自のクラスを作ることを検討してください。
このコードは型安全ではないので、同じキー名でまったく違う型が入っていてもコンパイル時に気づかず、実行時にたまに落ちる(例外が出る)ということになりかねません。(不安定なコードです) - コレクションの入れ子をうまく使いこなせていない状態では、もっと平易なコレクションにすることを考えた方がよいです。また問題にぶつかってコードが書けず、実装効率を落としますし、不具合を埋め込みやすくなり、品質が低下すると考えられるためです。
List<Dictionary<string, object>> でうまく作れないなら、List<DataClass> みたいに自作クラスでシンプルにすればわかりやすいでしょう。(参照型の比較問題は残ります)
次にいくつか、考え方のヒントを。
- keys["Key"] で Key を取り出せるのでは。
- AList をループで回して Key だけを取り出して List<string> でも作ると keys["Key"] と比較できるのでは。
- 編集済み AzuleanMVP, Moderator 2013年2月5日 14:26
- 回答としてマーク spiritlove 2013年2月6日 4:48