Передача списка строк в дерево - PullRequest
0 голосов
/ 28 октября 2009

У меня есть список строк с такими элементами

"Корень"

"Root / Элемент1"

"Root / Элемент2"

"Root / Item3 / SubItem1"

"Root / Item3 / SubItem2"

"Root / Item4 / SubItem1"

"AnotherRoot"

Как мне перевести этот список строк в древовидную структуру?

Ответы [ 3 ]

2 голосов
/ 28 октября 2009

Вы можете разбить каждый элемент на его подстроки. Затем с помощью рекурсии найдите каждый элемент, если родитель существует, добавьте к нему и, если родитель не существует, создайте его.

Если вы не видите, как это сделать, я отправлю вам пример кода

Пример кода

    public void AddItem(TreeView treeControl, TreeNode parent, string item)
    {
        TreeNodeCollection nodesRef = (parent != null) ? parent.Nodes : treeControl.Nodes;
        string currentNodeName;
        if (-1 == item.IndexOf('/')) currentNodeName = item;
        else  currentNodeName = item.Substring(0, item.IndexOf('/'));
        if (nodesRef.ContainsKey(currentNodeName))
        {
            AddItem(treeControl, nodesRef[currentNodeName], item.Substring(currentNodeName.Length+1));
        }
        else
        {
            TreeNode newItem = nodesRef.Add(currentNodeName, currentNodeName);
            if (item.Length > currentNodeName.Length)
            {
                AddItem(treeControl, newItem, item.Substring(item.IndexOf('/', currentNodeName.Length) + 1));
            }
        }
    }

И пример звонящего:

        string[] stringArr = {
                                 "Root",
                                 "Root/Item1",
                                 "Root/Item2",
                                 "Root/Item3/SubItem1",
                                 "Root/Item3/SubItem2",
                                 "Root/Item4/SubItem1",
                                 "AnotherRoot"
                             };
        foreach (string item in stringArr)
        {
            AddItem(treeView1, null, item);
        }
0 голосов
/ 28 октября 2009

Вы можете использовать этот код:

    private void button1_Click(object sender, EventArgs e) {
        List<String> paths = new List<String> { 
            "Root", "Root/Item1", "Root/Item2", "Root/Item3/SubItem1", 
            "Root/Item3/SubItem2", "Root/Item4/SubItem1", "AnotherRoot"
        };

        List<TreeNode> nodeCollection = new List<TreeNode>();

        foreach (var path in paths) {
            AddPath(nodeCollection, path);
        }

        treeView1.Nodes.Clear();
        treeView1.Nodes.AddRange(nodeCollection.ToArray());
    }

    public void AddPath(List<TreeNode> collection, String path) {
        LinkedList<String> pathToBeAdded = new LinkedList<String>(path.Split(new String[] { @"/" }, StringSplitOptions.RemoveEmptyEntries));

        if (pathToBeAdded.Count == 0) {
            return;
        }

        String rootPath = pathToBeAdded.First.Value;
        TreeNode root = collection.FirstOrDefault(n => n.Text.Equals(rootPath));

        if (root == null) {
            root = new TreeNode(rootPath);
            collection.Add(root);
        }

        pathToBeAdded.RemoveFirst();
        AddPath(root, pathToBeAdded);
    }

    public void AddPath(TreeNode rootNode, LinkedList<String> pathToBeAdded) {
        if (pathToBeAdded.Count == 0) {
            return;
        }

        String part = pathToBeAdded.First.Value;
        TreeNode subNode = null;

        if (!rootNode.Nodes.ContainsKey(part)) {
            subNode = rootNode.Nodes.Add(part, part);
        } else {
            subNode = rootNode.Nodes[part];
        }

        pathToBeAdded.RemoveFirst();
        AddPath(subNode, pathToBeAdded);
    }

Надеюсь, это поможет.

Рикардо Ласерда Каштелу-Бранку

0 голосов
/ 28 октября 2009

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

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