Advertisement
Guest User

Olostan

a guest
Sep 14th, 2010
468
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.74 KB | None | 0 0
  1.         private sealed class MyDumper
  2.         {
  3.             public static string Dump(Node root)
  4.             {
  5.                 // get all nodes (used later for "to parent" iteration
  6.                 var allNodeTuples = EnumerateNodes(root, null);
  7.                 // main query, later we'll agregate results
  8.                 var query = allNodeTuples.Select(tuple =>
  9.                 {
  10.                     var node = tuple.Item1;
  11.                     var parent = tuple.Item2;
  12.                     var s = new LinkedList<string>();
  13.                     s.AddLast(node.Text);
  14.                     s.AddLast(Environment.NewLine);
  15.                     if (parent != null)
  16.                     {
  17.                         // thats for 'closest' childs
  18.                         s.AddFirst("-");
  19.                         s.AddFirst(parent.Children.Last() != node ? "├" : "└");                        
  20.                         do
  21.                         {
  22.                             // build indention
  23.                             node = parent;
  24.                             var oldParent = parent;
  25.                             parent = allNodeTuples.Where(t => t.Item1 == oldParent).FirstOrDefault().Item2;
  26.                             if (parent != null)
  27.                                 s.AddFirst( (parent.Children.Last() != node
  28.                                                  ? "│ "
  29.                                                  : "  "));
  30.                         } while (parent != null);
  31.                     }
  32.                     // joins results into single line
  33.                     return string.Join(String.Empty, s);
  34.                 });
  35.                 // run query with string builder to aggregate
  36.                 return query.Aggregate(new StringBuilder(), (s, v) => s.Append(v)).ToString();
  37.             }
  38.  
  39.             // Enumerate all tree nodes, returning tuple with first item as node, second as node's parent
  40.             private static IEnumerable<Tuple<Node, Node>> EnumerateNodes(Node root, Node parent)
  41.             {
  42.                 /* recursive:
  43.                 yield return new Tuple<Node,Node>(root, parent);
  44.                 foreach (var child in root.Children)
  45.                     foreach (var sub in EnumerateNodes(child, root)) yield return sub;*/
  46.                 var workStack = new Stack<Tuple<Node, Node>>();
  47.                 workStack.Push(new Tuple<Node, Node>(root, parent));
  48.                 while (workStack.Count > 0)
  49.                 {
  50.                     var current = workStack.Pop();
  51.                     yield return current;
  52.                     foreach (var child in current.Item1.Children.Reverse())
  53.                         workStack.Push(new Tuple<Node, Node>(child, current.Item1));
  54.                 }
  55.             }
  56.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement