РЕДАКТИРОВАТЬ: Теперь, когда у нас есть бит больше контекста, похоже, у вас действительно есть XML для начала. Однако мы до сих пор не знаем, какую обработку вы выполняете над элементами. XSLT может быть правильным подходом, но другой будет использовать LINQ to XML и его Descendants
метод:
var doc = XDocument.Load(stream);
var descendants = doc.Descendants("Folder");
// Use descendants now
То, что может оказаться даже проще, чем подход XSLT. Например, если вы хотите преобразовать его в List<string>
, взяв атрибут из каждого элемента:
var doc = XDocument.Load(stream);
var names = doc.Descendants("Folder")
.Select(x => (strong) x.Attribute("name"))
.ToList();
Недостатком является то, что он все равно будет загружать весь XML-файл в память в виде XElement
(и т. Д.) Объектов. Вполне возможно, что версия XSLT может обрабатывать это потоковым способом с более эффективным использованием памяти. Димитр, без сомнения, может дать больше информации, если это уместно.
В LINQ нет ничего, что могло бы сгладить несколько уровней иерархии без выполнения рекурсии самостоятельно. SelectMany
выполняет один уровень сглаживания, но вам придется повторить, чтобы свести вашу многоуровневую иерархию к одному списку.
Теперь, если вы используете LINQ to XML, поддерживает очень легко - вы можете просто использовать метод Descendants
:
var allFolders = root.Descendants("Folder");
Чтобы написать что-то похожее для вашего класса домена, вам нужно написать больше кода. Если вы можете дать больше информации о том, что вы действительно получили (XML или классы доменов), мы можем помочь вам больше.
РЕДАКТИРОВАТЬ: Хорошо, похоже, XML здесь красная сельдь. Но найти всех потомков довольно легко. Вы можете сделать это, используя блоки итераторов, но это становится довольно неприятно неэффективно довольно быстро. Вот еще одна простая альтернатива:
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);
}
}
Вы можете адаптировать точный алгоритм в зависимости от порядка, в котором вы хотите вернуть детей.