Я бы рекомендовал вам создать набор ваших собственных помощников по дереву, например, следующий для вашей задачи:
public static class TreeHelpers
{
public static IEnumerable<TItem> GetAncestors<TItem>(TItem item, Func<TItem, TItem> getParentFunc)
{
if (getParentFunc == null)
{
throw new ArgumentNullException("getParentFunc");
}
if (ReferenceEquals(item, null)) yield break;
for (TItem curItem = getParentFunc(item); !ReferenceEquals(curItem, null); curItem = getParentFunc(curItem))
{
yield return curItem;
}
}
//TODO: Add other methods, for example for 'prefix' children recurence enumeration
}
И пример использования (в вашем контексте):
IList<TreeNode> ancestorList = TreeHelpers.GetAncestors(node, x => x.Parent).ToList();
Почему это лучше, чем использовать list <>. Add ()?- поскольку мы можем использовать ленивые функции LINQ, такие как .FirstOrDefault (x => ...)
PS, чтобы включить «текущий» элемент в перечисляемый результат, используйте TItem curItem = item
вместо TItem curItem = getParentFunc(item)