1

我想从以下 xml 中选择子项的所有不同值

<root>
  <parent>
    <child>value 1</child>
    <child>value 2</child>
  </parent>
  <parent>
    <child>value 1</child>
    <child>value 4</child>
  </parent>
</root>

我试过以下:

var vals  = (from res in XmlResources.Elements("root").Elements("parent") select res)
                                        .SelectMany(r => r.Elements("child")).Distinct().ToList();

但无法从中获得价值,给我价值包装在标签中而不是 Distinct

是否可以显示两种获取方法 - 查询和链接又名 lambda。

4

2 回答 2

3

您正在选择元素,并且这些元素都是不同的。您需要获取不同的。例如:

var values = XmlResources.Element("root")
                         .Elements("parent")
                         .Elements("child")
                         .Select(x => x.Value)
                         .Distinct();

在这里使用查询表达式确实没有任何好处——它只会增加麻烦。当查询具有多个方面(例如,位置有意义的选择或连接)时,我只使用查询表达式。对于只是一个选择只是一个毫无意义的地方。所以是的,你可以使用:

var values = (from x in XmlResources.Element("root")
                                    .Elements("parent")
                                    .Elements("child")
              select x.Value).Distinct();

……但你为什么要这样做?IMO 不太清楚。

请注意,如果您不太关心根/父/子层次结构,并且很高兴获得所有child后代,则可以使用:

var values = XmlResources.Descendants("child")
                         .Select(x => x.Value)
                         .Distinct();
于 2012-07-09T08:46:12.890 回答
2

是的,两种方式都有可能

var doc = new XDocument("your xml string");
var values = (from c in doc.Root.Descendants("child") select c.Value).Distinct();

//链式风格

var values = doc.Root.Descendants("child").Select(c=>c.Value).Distinct();
于 2012-07-09T08:45:51.983 回答