Мы используем пользовательского поставщика для многоязыковой поддержки и помещаем все тексты в таблицу базы данных. Это работает хорошо кроме, мы иногда сталкиваемся с кэширующимися проблемами при обновлении текстов в базе данных, не обновляя веб-приложение.
Уловка состоит в том, чтобы передать строку в качестве отступа и обработать последний дочерний элемент специально:
class Node
{
public void PrintPretty(string indent, bool last)
{
Console.Write(indent);
if (last)
{
Console.Write("\\-");
indent += " ";
}
else
{
Console.Write("|-");
indent += "| ";
}
Console.WriteLine(Name);
for (int i = 0; i < Children.Count; i++)
Children[i].PrintPretty(indent, i == Children.Count - 1);
}
}
При таком вызове:
root.PrintPretty("", true);
будет выводить в следующем стиле:
\-root
\-child
|-child
\-child
|-child
|-child
\-child
|-child
|-child
| |-child
| \-child
| |-child
| |-child
| |-child
| \-child
| \-child
| \-child
\-child
|-child
|-child
|-child
| \-child
\-child
\-child
Создать метод PrintNode и использовать рекурсию:
class Node
{
public string Name;
public decimal Time;
public List<Node> Children = new List<Node>();
public void PrintNode(string prefix)
{
Console.WriteLine("{0} + {1} : {2}", prefix, this.Name, this.Time);
foreach (Node n in Children)
if (Children.IndexOf(n) == Children.Count - 1)
n.PrintNode(prefix + " ");
else
n.PrintNode(prefix + " |");
}
}
А затем, чтобы распечатать все дерево, просто выполните:
topNode.PrintNode("");
В моем примере это даст нам что-то вроде этого:
+ top : 123
| + Node 1 : 29
| | + subnode 0 : 90
| | + sdhasj : 232
| | + subnode 1 : 38
| | + subnode 2 : 49
| | + subnode 8 : 39
| + subnode 9 : 47
+ Node 2 : 51
| + subnode 0 : 89
| + sdhasj : 232
| + subnode 1 : 33
+ subnode 3 : 57