C# - TreeView - 数据算法

问题描述 投票:0回答:1

我使用 C# WPF TreeView。

我有以下输入数据:(比如我需要处理的 1000 多行)

\Folder\Base\Data\dat.cfg
\Folder\Base\Data1\dat.cfg
\Folder\dat.cfg

集合类 - TreeItem。用于 TreView 绑定。

    public class TreeItem : MyViewModel
    {
        public TreeItem()
        {
            this.Children = new ObservableCollection<TreeItem>();
        }

        public string Name { get; set; }

        public ObservableCollection<TreeItem> Children { get; set; }
    }

我花了这几天时间,但无法弄清楚如何获取请求点的数据的算法。

如果有人能给我帮助或如何实现它,我将非常感激。

提前谢谢您。

这是我的收藏课

我需要在我定义的集合类 - TreeItem 中完成要解析的输入数据,如下所示。 基本上只是在 TreeView 中作为具有级别的节点工作。

Requested data structure


CollectionTreeItem
[0] Name - "Folder"
    Children
    [0] Name - "Base"
        Children 
            [0] Name - "Data"
            Children 
                [0] Name - "dat.cfg"
                Children 

仅包含已处理行的示例 - \Folder\Base\Data\dat.cfg。当然会有更多的孩子有其他的台词。

c# algorithm treeview tree-traversal
1个回答
0
投票

您可以使用递归算法来构建树。

treeObjects
应该保持您想要实现的结构。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;


class Program
{
    static void Main()
    {
        string[] paths = new string[]
        {
            @"\Folder\Base\Data\dat.cfg",
            @"\Folder\Base\Data1\dat.cfg",
            @"\Folder\dat.cfg"
            // Rest of your paths
        };

        var root = new TreeItem { Name = "Root" };

        BuildTree(root, paths);

        var treeObjects = GetTreeObjects(root);
    }

    static void BuildTree(TreeItem root, string[] paths)
    {
        foreach (var path in paths)
        {
            AddPathToTree(root, path.Split('\\').Skip(1).ToArray());
        }
    }

    static void AddPathToTree(TreeItem root, string[] path)
    {
        TreeItem currentNode = root;

        foreach (var folder in path)
        {
            var existingNode = currentNode.Children.FirstOrDefault(c => c.Name == folder);

            if (existingNode == null)
            {
                var newNode = new TreeItem { Name = folder };
                currentNode.Children.Add(newNode);
                currentNode = newNode;
            }
            else
            {
                currentNode = existingNode;
            }
        }
    }

    static List<CollectionTreeItem> GetTreeObjects(TreeItem node)
    {
        var result = new List<CollectionTreeItem>
        {
            new CollectionTreeItem
            {
                Name = node.Name,
                Children = GetChildrenObjects(node.Children)
            }
        };

        return result;
    }

    static List<CollectionTreeItem> GetChildrenObjects(ObservableCollection<TreeItem> children)
    {
        var result = new List<CollectionTreeItem>();

        foreach (var child in children)
        {
            var childObject = new CollectionTreeItem
            {
                Name = child.Name,
                Children = GetTreeObjects(child)
            };

            result.Add(childObject);
        }

        return result;
    }
}

public class CollectionTreeItem
{
    public string Name { get; set; }

    public List<CollectionTreeItem> Children { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.