我使用 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 中作为具有级别的节点工作。
CollectionTreeItem
[0] Name - "Folder"
Children
[0] Name - "Base"
Children
[0] Name - "Data"
Children
[0] Name - "dat.cfg"
Children
仅包含已处理行的示例 - \Folder\Base\Data\dat.cfg。当然会有更多的孩子有其他的台词。
您可以使用递归算法来构建树。
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; }
}