2010-06-09 60 views
1

我试图将一个属性用作关键字,另一个用作值。如果我使用(是XDOC在例如XDocument对象):从XElement中取2个属性来创建一个字典LINQ

Dictionary<string, XElement> test = xDoc.Descendants() 
    .Where<XElement>(t => t.Name == "someelement") 
    .ToDictionary<XElement, string>(t => t.Attribute("myattr").Value.ToString()); 

我得到一本字典与myattr值为键(这是我想要什么),但整个的XElement对象的值。

我想要做的是选择第二个属性设置为每个字典项目的值属性,但似乎无法弄清楚。

是否有可能在1 Linq声明中做到这一切?好奇已经吸引了我!

干杯!

回答

4

是的,你可以通过另一种表达是,选择你想要的值:

Dictionary<string,string> test = xDoc.Descendants() 
    .Where(t => t.Name == "someelement") 
    .ToDictionary(
     t => t.Attribute("myattr").Value.ToString(), 
     t => t.Attribute("otherAttribute").Value.ToString()); 
+0

很好用!感谢您的答案,但为什么演员改变了事情?如果我在第二个表达式中进行投射,它会查找比较器。 – AndrewC 2010-06-09 17:04:27

+0

@AndyC,你想要投什么? ToDictionary有一些不同的重载,其中一个采用比较器。 – driis 2010-06-09 17:06:07

+0

在我原来的代码中我有,取出它已经使它的工作。只是好奇这是为什么。 – AndrewC 2010-06-09 17:06:54

1

在.ToDictionary()调用的铸件从周围的对象定义翻转参数。

所有你需要做的是放下它并添加一个身份选择,它应该工作。

Dictionary<string, XElement> test = xDoc.Descendants() 
      .Where<XElement>(t => t.Name == "someelement") 
      .ToDictionary(t => t.Attribute("myattr").Value.ToString(), t => t); 
+0

.ToDictionary()中的第二个参数非常有用。 t => t隐含在仅使用keySelector的单个参数重载中。 – 2016-08-16 16:45:11

相关问题