static class Dumper { public static string Dump(Node root) { var sb = new StringBuilder(); foreach (var line in dump(root)) sb.AppendLine(line); return sb.ToString(); } static private IEnumerable dump(Node root) { yield return root.Text; if (root.Children.Count == 0) yield break; for (int i = 0; i < root.Children.Count; i++) { bool firstLineOfChild = true; bool lastChild = i == root.Children.Count - 1; foreach (var line in dump(root.Children[i])) { string prefix = lastChild ? (firstLineOfChild ? "└─" : " ") : (firstLineOfChild ? "├─" : "│ "); yield return prefix + line; firstLineOfChild = false; } } } }