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 ではなくタグでラップされた値が得られます

それを取得する両方の方法を示すことは可能ですか - クエリと連鎖別名ラムダ。

4

2 に答える 2

3

要素を選択していて、要素はすべて異なっています。個別の値を取得する必要があります。例えば:

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

ここでクエリ式を使用しても、実際には何のメリットもありません。クエリに複数の側面がある場合にのみクエリ式を使用します (例: where意味のある選択、または結合)。選択するだけ、またはそれがかなり無意味なだけの場合。はい、使用できます:

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 に答える