Добавьте этот метод к классу Node
:
public IEnumerable<Node> DescendantsAndSelf()
{
yield return this;
if (Children != null) {
foreach (Node child in Children) {
foreach (Node node in child.DescendantsAndSelf()) {
yield return node;
}
}
}
}
И вам не нужны разные итераторы для разных типов узлов. Просто используйте .Where(...)
var allAnimals = myTopNode.DescendantsAndSelf()
.Where(n => n.IsAnimal);
Если вы принимаете близко к сердцу предложение @ LasseVågsætherKarlsen и выводите различные типы узлов из абстрактного базового класса Node
, тогда вы можете получить животных, набранных как Animal
, например:
IEnumerable<Animal> allAnimals = myTopNode.DescendantsAndSelf()
.OfType<Animal>();
Вы также можете объявить Children
как:
public List<Node> Children { get; } = new List<Node>();
Таким образом, Children
никогда не будет нулевым, а HasChildren
будет реализован как:
public bool HasChildren => Children.Count > 0;
См: