なんとなく one liner
public static IEnumerable<T> Flatten<T>(T root, Func<T, IEnumerable<T>> childrenSelector) {
return Enumerable.Repeat(root, 1).Concat(childrenSelector(root).SelectMany(x => Flatten(x, childrenSelector)));
}
Action<T> をとる DoRecursive を最初に作っておいたけど、汎用的に。