Я нашел реализацию для дерева на этом вопросе . К сожалению, я не знаю, как его использовать. Также я внес изменения в него, поскольку LinkedList не имеет метода Add:
delegate void TreeVisitor<T>(T nodeData);
class NTree<T>
{
T data;
List<NTree<T>> children;
public NTree(T data)
{
this.data = data;
children = new List<NTree<T>>();
}
public void AddChild(T data)
{
children.Add(new NTree<T>(data));
}
public NTree<T> GetChild(int i)
{
return children[i];
}
public void Traverse(NTree<T> node, TreeVisitor<T> visitor)
{
visitor(node.data);
foreach (NTree<T> kid in node.children)
Traverse(kid, visitor);
}
}
У меня есть класс с именем tTable, и я хочу сохранить в этом дереве его детей и их внуков (...). Мне нужно найти непосредственных детей, а не пересечь все дерево. Мне также может понадобиться найти детей по некоторым критериям. Допустим, у tTable есть только имя, и я хочу найти детей с именами, соответствующими некоторым критериям. Конструктор tTables присваивает имени значение согласно int-значению (каким-либо образом).
Как использовать Traverse (написать делегат), если у меня есть такой код;
int i = 0;
Dictionary<string, NTree<tTable>> tableTreeByRootTableName =
new Dictionary<string, NTree<tTable>>();
tTable aTable = new tTable(i++);
tableTreeByRootTableName[aTable.Name] = new NTree(aTable);
tableTreeByRootTableName[aTable.Name].AddChild(new tTable(i++));
tableTreeByRootTableName[aTable.Name].AddChild(new tTable(i++));
tableTreeByRootTableName[aTable.Name].GetChild(1).AddChild(new tTable(i++));