Наверное, нет, но это полностью зависит от того, как вы это сделали. Вы можете использовать yield
рекурсивно:
public IEnumerable<CustomObject> AndChildren()
{
yield return this;
foreach(var child in Childs)
{
foreach(var nested in child.AndChildren())
{
yield return nested;
}
}
}
Что имеет очевидное преимущество, заключающееся в позднем связывании и, следовательно, намного лучше в использовании вашей памяти. Недостатком является то, что он чрезвычайно хрупок с точки зрения любых изменений, вносимых в любой узел в дереве (итераторы foreach
будут вызывать исключение для следующего, если какой-либо из списков будет изменен).
Чтобы обойти это, вы можете быстро загрузить результат, используя метод Linq .ToArray()
.
Итак, теперь, если вы хотите пройтись по всему дереву, вы просто делаете:
foreach(var obj in the_root_object.AndChildren())
{
}
Предположим, the_root_object
- это экземпляр CustomObject
, который, как вы выразились, имеет различные «вены».
Это должно быть слегка переписано, если у вас есть конкретное требование к порядку отображения объектов относительно их дочерних элементов.