Và chỉ để cho vui (gần một thập kỷ sau) một câu trả lời cũng sử dụng Generics nhưng với vòng lặp Stack và While, dựa trên câu trả lời được chấp nhận bởi @vidstige.
public static class TypeExtentions
{
public static IEnumerable<T> Descendants<T>(this T root, Func<T, IEnumerable<T>> selector)
{
var nodes = new Stack<T>(new[] { root });
while (nodes.Any())
{
T node = nodes.Pop();
yield return node;
foreach (var n in selector(node)) nodes.Push(n);
}
}
public static IEnumerable<T> Descendants<T>(this IEnumerable<T> encounter, Func<T, IEnumerable<T>> selector)
{
var nodes = new Stack<T>(encounter);
while (nodes.Any())
{
T node = nodes.Pop();
yield return node;
if (selector(node) != null)
foreach (var n in selector(node))
nodes.Push(n);
}
}
}
Đưa ra một bộ sưu tập người ta có thể sử dụng như thế này
var myNode = ListNodes.Descendants(x => x.Children).Where(x => x.Key == SomeKey);
hoặc với một đối tượng gốc
var myNode = root.Descendants(x => x.Children).Where(x => x.Key == SomeKey);