public static IEnumerable Traverse(T item, Func> childSelector) { var stack = new Stack(); stack.Push(item); while (stack.Any()) { var next = stack.Pop(); yield return next; foreach (var child in childSelector(next)) stack.Push(child); } }