使用LINQ将XML解析为Dictionary

Pol*_*ing 4 c# linq

我有一个配置文件,如:

<ConfigurationFile>
    <Config name="some.configuration.setting" value="some.configuration.value"/>
    <Config name="some.configuration.setting2" value="some.configuration.value2"/>
    ...
</ConfigurationFile>
Run Code Online (Sandbox Code Playgroud)

我试图将其读取为XML并将其转换为字典.我尝试编写一些代码,但这显然是错误的,因为它不能编译.

Dictionary<string, string> configDictionary = (from configDatum in xmlDocument.Descendants("Config")
                                               select new
                                               {
                                                   Name = configDatum.Attribute("name").Value,
                                                   Value = configDatum.Attribute("value").Value,
                                               }).ToDictionary<string, string>(Something shoudl go here...?);
Run Code Online (Sandbox Code Playgroud)

如果有人能告诉我如何使这个工作,那将是非常有帮助的.当然,我总是可以阅读它

Tom*_*cek 14

要给出更详细的答案 - 您可以ToDictionary完全按照您在问题中所写的那样使用.在缺少的部分,您需要指定"键选择器"和"值选择器"这两个函数告诉ToDictionary方法您要转换的对象的哪个部分是键,哪个是值.您已经将这两个提取为匿名类型,因此您可以编写:

var configDictionary = 
 (from configDatum in xmlDocument.Descendants("Config")
  select new {
    Name = configDatum.Attribute("name").Value,
    Value = configDatum.Attribute("value").Value,
  }).ToDictionary(o => o.Name, o => o.Value);
Run Code Online (Sandbox Code Playgroud)

请注意,我删除了泛型类型参数规范.C#编译器自动计算(我们使用带有三个泛型参数重载).但是,您可以避免使用匿名类型 - 在上面的版本中,您只需创建它以临时存储该值.最简单的版本就是:

var configDictionary = 
  xmlDocument.Descendants("Config").ToDictionary(
    datum => datum.Attribute("name").Value,
    datum => datum.Attribute("value").Value );
Run Code Online (Sandbox Code Playgroud)