Как перебрать список объектов, который имеет список того же типа, и добавить каждый объект в TreeView? - PullRequest
0 голосов
/ 17 февраля 2019

Название может быть не очень ясным, но я попытаюсь объяснить больше здесь ...

У меня есть следующий класс ...

public class Node
{
    public string Name { get; set; } = string.Empty;

    public List<Node> Children { get; set; } = new List<Node>();

    public Node(string name, List<Node> children)
    {
        Name = name;
        Children = children;
    }

    public Node() {  }
}

И у меня есть TreeView , который должен иметь такие элементы ...

- Root
    - Node 0_0
        - Node 1_0
            - Node 2_0
        - Node 1_1
    - Node 0_1
        - Node 1_0
        - Node 1_1

И так далее ...

В настоящее время я использую этот неэффективный, плохой, пирамидальный подход...

var rootNode = GetNodeFromString();

var rootTreeNode = TreeView1.Items.Add(new TreeNode(rootNode.Name));

foreach (var child0 in rootNode.Children)
{       
    var node1 = rootTreeNode.Items.Add(new TreeNode(child0.Name));  

    foreach (var child1 in node1.Children)
    {
        node1.Items.Add(new TreeNode(child1.Name));

        // Repeat the code 30 more times...
    }
}

Есть ли другой способ достичь неограниченной глубины?( на самом деле не ограничено, что-то вроде 128 слоев )

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Я сам нашел способ сделать это в 11 строк ...

public static TreeNode ToTreeNode(Node root)
{
    var treeNode = new TreeNode(root.Name);

    foreach (var node in root.Children)
    {
        treeNode.Nodes.Add(ToTreeNode(node));
    }

    return treeNode;
}
0 голосов
/ 17 февраля 2019

Универсальное решение

Вы можете создать общий метод, например, такой:

private TreeNode ConvertEntityToTreeNode<T>(
    T entity,
    Func<T, IEnumerable<T>> getChilds,
    Func<T, TreeNode> createTreeNode)
{
    TreeNode node = createTreeNode(entity);
    var childs = getChilds(entity);
    foreach (T child in childs)
        node.Nodes.Add(ConvertEntityToTreeNode(child, getChilds, createTreeNode));
    return node;
}
  • entity: объект, который будет корневымв древовидной иерархии.
  • getChilds: выражение для получения дочерних элементов из узла.
  • createTreeNode: выражение для создания TreeNode из сущности.

Затем используйте его следующим образом:

var treeNode = ConvertEntityToTreeNode(node, x => x.Children, x => new TreeNode(x.Name));
treeView1.Nodes.Add(treeNode);

Неуниверсальное решение

Вы уже нашли его самостоятельно.Это довольно просто и просто:

private TreeNode ConvertEntityToTreeNode(Node entity)
{
    var node = new TreeNode(entity.Name);
    foreach (var child in entity.Children)
        node.Nodes.Add(ConvertEntityToTreeNode(child));
    return node;
}

Тогда используйте его следующим образом:

var treeNode = ConvertEntityToTreeNode(node);
treeView1.Nodes.Add(treeNode);

Почему вам может потребоваться универсальное решение?

На всякий случай у вас есть пара классов узлов и деревьев.Алгоритм создания всегда один и тот же, вам просто нужно знать:

  1. Корневой объект
  2. Как получить дочерний объект
  3. Как создатьTreeNode использование объекта

Тогда алгоритм всегда является рекурсивным алгоритмом, который вы видите в обобщенном методе.

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