2008年11月30日

XMLからDictionary型への変換

   このエントリーをはてなブックマークに追加 Clip to Evernote
<root>
   <key1>値1</key1>
   <key2>値2</key2>
   <key3>値3</key3>
   <key4>値4</key4>
</root>

といったXMLファイルに対して、以下のようなコードを書いた。
XDocument xdoc = XDocument.Load("sample.xml");
var query = from pair in xdoc.Root.Elements()
            select new {
                Key = pair.Name.ToString(),
                Value = int.Parse(pair.Value)
            };
var dict = query.ToDictionary<string,int>(
    (x => x.Key), (x => x.Value));
foreach (var d in dict) {
    Console.WriteLine(d.Key + "=" + d.Value);

XMLからDictionary型への変換をしているわけだ。
でも、ToDictionaryの箇所で、 「ジェネリックの第1型引数のTSourceが抜けている」のでエラーのなってしまう。
匿名クラスなんだから、ここで、型を書くわけにはいかないし...
ということは、匿名クラスじゃなくて、KeyValuePairを使えばいいんだな。
で、書いたコード。
XDocument xdoc = XDocument.Load("sample.xml");
var query = from xbook in xdoc.Root.Elements()
            select new KeyValuePair<string, int>(
                xbook.Name.ToString(), 
                int.Parse(xbook.Value));
var dict = query.ToDictionary<KeyValuePair<string,int>,string,int>(
    (x => x.Key), (x => x.Value));
foreach (var d in dict) {
    Console.WriteLine(d.Key + "=" + d.Value);

うーん、ToDictionaryが冗長すぎる。
でも、よくよく考えたら、ジェネリックメソッドの型推論には、匿名型もOKなんだから、

XDocument xdoc = XDocument.Load("sample.xml");
var query = from pair in xdoc.Root.Elements()
            select new {
                Key = pair.Name.ToString(),
                Value = int.Parse(pair.Value)
            };
var dict = query.ToDictionary(
    (x => x.Key), (x => x.Value));
foreach (var d in dict) {
    Console.WriteLine(d.Key + "=" + d.Value);

で良かった。
カギカッコが無くなってすっきりした。


この記事へのコメント
辞書のkeyとValueを入れ替える方法で、悩んでいました。
おかげさまで解決できました。
Posted by rockecco at 2013年04月04日 12:40
rockeccoさん、お役にたててよかったです。
Posted by Gushwell at 2013年04月04日 20:20
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51693878
この記事へのトラックバック
ある辞書を作ったとして、その辞書のKeyとValueをひっくり返したいとする。RubyやPythonなら、「Dictionary key value 入れ替え」というキーワードでGoogle先生が教えてくれるのだが、あいにく.Netではなかなか良さそうな文献が見つからなかった。ToDictionaryを使えば良いこ
DictionaryのKeyとValueを入れ替える〜VB2008【ロケッこがゆく】at 2013年04月04日 12:39