Предполагая, что в конечном итоге вам понадобится только пара узлов определенного типа, было бы более эффективно использовать ключевое слово yield, чтобы избежать получения большего, чем нужно:
public static IEnumerable<INode> GetDescendants(this INode node)
{
foreach (INode child in node.ChildrenAsList)
{
yield return child;
foreach (INode grandChild in child.GetDescendants())
{
yield return grandChild;
}
}
yield break;
}
Итак, ваш последний вызовполучить узлы по типу будет:
new Node(-1).GetDescendants().Where(x => x.NodeTypeAlias == "myNodeType")
Так что, если вы хотите получить только первые пять, вы можете добавить .Take (5) до конца, и вы будете повторять только первые 5 результатов, а невытащить целое дерево.