Voglio selezionare tutti i valori distinti di child dal seguire xml
<root>
<parent>
<child>value 1</child>
<child>value 2</child>
</parent>
<parent>
<child>value 1</child>
<child>value 4</child>
</parent>
</root>
Ho provato a seguire:
var vals = (from res in XmlResources.Elements("root").Elements("parent") select res)
.SelectMany(r => r.Elements("child")).Distinct().ToList();
Ma non può ricavarne il valore, mi dà un valore racchiuso tra tag e non distinti
È possibile mostrare entrambi i modi per ottenerlo: query e concatenamento aka lambda.
risposte:
1 per risposta № 1sì, è possibile in entrambi i modi
var doc = new XDocument("your xml string");
var values = (from c in doc.Root.Descendants("child") select c.Value).Distinct();
// stile di concatenamento
var values = doc.Root.Descendants("child").Select(c=>c.Value).Distinct();
2 per risposta № 2
Stai selezionando gli elementi, e il elementi sono tutti distinti. Devi ottenere il distinto valori. Per esempio:
var values = XmlResources.Element("root")
.Elements("parent")
.Elements("child")
.Select(x => x.Value)
.Distinct();
Non c'è davvero alcun vantaggio nell'utilizzare un'espressione di query qui - aggiunge solo cruft. Io uso solo un'espressione di query quando la query ha molteplici aspetti (ad es. e una selezione significativa, o un join). Per solo una selezione o solo un dove è abbastanza inutile, quindi sì, puoi usare:
var values = (from x in XmlResources.Element("root")
.Elements("parent")
.Elements("child")
select x.Value).Distinct();
... ma perché dovresti? È molto meno chiaro IMO.
Nota che se non ti preoccupi troppo della gerarchia radice / genitore / figlio, e sei felice di averlo tutti il child
discendenti, puoi usare:
var values = XmlResources.Descendants("child")
.Select(x => x.Value)
.Distinct();