6

次のようなXMLファイルがあります。

<Cities>
    <Name>Seattle</Name>
    <State>WA</State>
    <Population>552105</Population>
</Cities>

都市情報を辞書にロードして、辞書が次のようになるようにします。

cityDictionary("Name") = "Seattle"
cityDictionary("State") = "WA"
cityDictionary("Population") = "552105"

次のコードは機能します。

var doc = XDocument.Load(@"..\..\Cities.xml");
var rootNodes = doc.Root.DescendantNodes().OfType<XElement>();
var keyValuePairs = from n in rootNodes
                    select new
                    {
                        TagName = n.Name,
                        TagValue = n.Value
                    };

Dicitionary<string, string> allItems = new Dictionary<string, string>();
foreach (var token in keyValuePairs) {
    allItems.Add(token.TagName.ToString(), token.TagValue.ToString());
}

しかし、私はこれを一歩やりたいと思っています。

助言がありますか?

4

4 に答える 4

12

なぜそんなに複雑なのですか?メソッドチェーン構文でそれを行う方法は次のとおりです。

var allItems = rootNodes.ToDictionary(n => n.Name.ToString(), n => n.Value);

または、古いバージョンの C# を使用する必要がある場合、または昔ながらのものを維持したい場合は、単純な古いループとして:

var allItems = new Dictionary<string, string>();
foreach (var node in rootNodes)
{
    allItems.Add(node.Name.ToString(), node.Value);
}
于 2012-08-14T15:36:20.133 に答える
5

これを使用してみてくださいToDictionary.

    Dictionary<string, string> allItems = rootNodes.ToDictionary(v => v.Name, v => v.Value);
于 2012-08-14T15:31:56.763 に答える
0

この例では、TagNameが文字列に変換されていることを確認する必要があります

Dictionary<string, string> allItems = (from n in rootNodes
select new
            {
                TagName = n.Name,
                TagValue = n.Value
            }).ToDictionary(v => v.TagName.ToString(), v => v.TagValue);

または、XNameをキーとして保存します

Dictionary<XName, string> allItems = (from n in rootNodes
select new
            {
                TagName = n.Name,
                TagValue = n.Value
            }).ToDictionary(v => v.TagName, v => v.TagValue);
于 2012-08-14T15:38:58.463 に答える