EDIT: Ora che abbiamo un po 'di più contesto, sembra che tu hai effettivamente avuto XML per cominciare. Tuttavia, non sappiamo ancora quale elaborazione stai eseguendo sugli elementi. XSLT può essere il giusto approccio, ma un altro sarebbe quello di utilizzare LINQ to XML e il suo metodo Descendants
:
var doc = XDocument.Load(stream);
var descendants = doc.Descendants("Folder");
// Use descendants now
Che può finire per essere ancora più semplice rispetto all'approccio XSLT. Ad esempio, se si vuole trasformarlo in un List<string>
prendendo un attributo da ogni elemento:
var doc = XDocument.Load(stream);
var names = doc.Descendants("Folder")
.Select(x => (strong) x.Attribute("name"))
.ToList();
Uno svantaggio è che questo sarà ancora caricare l'intero file XML in memoria come XElement
(ecc) oggetti. È del tutto possibile che la versione XSLT sia in grado di gestirlo in streaming con un utilizzo della memoria più efficiente. Dimitre può senza dubbio fornire maggiori informazioni se questo è pertinente.
Non c'è niente in LINQ per appiattire multipla livelli gerarchici senza eseguire la ricorsione da soli. SelectMany
esegue uno livello di appiattimento, ma è necessario recurse per appiattire la gerarchia multilivello in un unico elenco.
Ora, se si sta utilizzando LINQ to XML, che fa supporto molto facilmente - si può semplicemente utilizzare il metodo Descendants
:
var allFolders = root.Descendants("Folder");
di scrivere qualcosa di simile per la classe di dominio, però, si' d bisogno di scrivere più codice Se puoi fornire ulteriori informazioni su ciò che hai in realtà ottenuto (classi XML o dominio) potremmo essere in grado di aiutarti di più.
EDIT: Ok, sembra che XML sia una falsa pista qui. Ma trovare tutti i discendenti è abbastanza facile.È possibile farlo utilizzando blocchi iteratore, ma che diventa piuttosto spiacevolmente inefficiente abbastanza rapidamente. Ecco un altro semplice alternativa:
public IList<Folder> SelfAndDescendants()
{
List<Folder> ret = new List<Folder>();
AddSelfAndDescendants(ret);
return ret;
}
private void AddSelfAndDescendants(IList<Folder> list)
{
list.Add(this);
foreach (var child in children)
{
AddSelfAndDescendants(list);
}
}
è possibile personalizzare l'algoritmo esatto in base all'ordine in cui si desidera ottenere i bambini indietro.
Cosa intendi con "elenco semplice"? –
elenco semplice significa che l'elenco genitore nell'esempio precedente ha solo {A, B} e voglio convertirlo in {A, A.1, A.1.1, A.1.2, A.2, A.2.1, ... ., B.2.2, B.2.2.1, B.2.2.2} –