Есть ли название для такого объекта? И как бы я go заполнил дерево? - PullRequest
0 голосов
/ 27 февраля 2020

Я использую структуру объекта следующим образом:

class Node
{
    string name;
    List<Node> children = new List<Node>{};
    Node parent;
}

Я могу добавить дочерние элементы или узлы на том же уровне, что и текущий узел.

Есть ли термин для таких объектов?

Как бы я заполнил представление дерева wpf этим, чтобы оно выглядело так:

parent0
   child0
   child1
       child0ofchild1
    .
    .
    .

Я хочу, чтобы это могло быть бесконечно длинным, поэтому фиксированное значение для -l oop не вариант. foreach работал довольно хорошо, но я сталкиваюсь с проблемами, когда спускаюсь более чем на 2 уровня в этом дереве. Есть ли что-то попроще уже в c# или я на правильном пути?

Извините, если это повторяющийся вопрос, но я не знаю правильный термин для Google ...

1 Ответ

0 голосов
/ 27 февраля 2020

Для обхода дерева рекурсивная функция является универсальным решением. При связывании с деревом WPF я бы использовал ObservableCollection вместо List для дочерних элементов. Я сделал простой пример с рекурсивной функцией построения дерева, а затем отображения его в WPF TreeView. Это класс данных:

    public class TreeNode {
        public ObservableCollection<TreeNode> Children {
            get;
        } = new ObservableCollection<TreeNode>();

        public string Name {
            get;set;
        }
    }

Это рекурсивная функция для заполнения дерева (генерирует 5 поколений дочерних элементов, каждый родительский узел имеет 6 дочерних элементов):

        /// <summary>
        /// Fill a recursive tree
        /// </summary>
        /// <param name="node">The treenode to generate children for</param>
        /// <param name="depth">Current depth, always incremented by 1 when going deeper in recursion</param>
        /// <param name="namePostfix">Name postfix, just for generating display name for the nodes</param>
        void fillTree(TreeNode node, int depth, string namePostfix) {
            // exit to prevent endless recursion
            if (depth >= 5) {
                return;
            }
            for (int i = 0; i < 6; ++i) {
                var child = new TreeNode() {
                    Name = $"Node{namePostfix}{i}"
                };
                fillTree(child, depth + 1, namePostfix + i);
                node.Children.Add(child);
            }
        }

Если если вы хотите пройтись по дереву, вы должны написать что-то похожее в соответствии с выбранным вами методом обхода (из предыдущего ответа).

XAML-разметка (см. эту ссылку для ознакомления с базой c учебник):

    <TreeView x:Name="tv">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type local:TreeNode}" ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Name}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

И в конструкторе Window / Page:

            fillTree(tree, 0, "");
            tv.Items.Add(tree);  // tv is the x:Name of the TreeView

Конечно, это всего лишь простой пример, я бы использовал модель представления и привязку данных и т. д. c, но это выходит за рамки этого вопроса.

...