【发布时间】:2012-12-30 23:35:36
【问题描述】:
我正在寻找一种在树中隐藏节点的方法。 我正在过滤具有节点类型的节点,这是我的原始结构:
root
+FolderA
-File1
-File2
-File3
+FolderB
-File4
-File5
+FolderB-1
-File6
这就是我想要做的:
+root
-File1
-File2
-File3
-File4
-File5
-File6
我创建了我的类 XNode,其中包含一个类型和一个子项列表。 (这是伪语言的缩写)
Class XNode
MyType type;
string Name;
List<XNode> childrens;
End Class
我创建了一个工厂类来查询我的数据库并创建原始树。
我创建了一个 Xaml treeView UserControl 来绑定我创建的根 XNode。
无法通过 Xaml 隐藏节点,此操作必须使用绑定对象(我创建的根 Xnode)完成。
现在我的问题是: 有递归算法可以取消“文件夹类型”节点,获取其子节点并将它们添加到父节点?
我试试:
public XNode RemoveFoldersElements(ref XNode rootNode)
{
if (rootNode != null)
{
if (rootNode.Children.Count > 0)
{
for (int i = 0; i < rootNode.Children.Count; i++)
{
XNode children = rootNode.Children.ElementAt(i);
if (children.WType == NodeType.Type_FOLDER)
{
XNode tempNode = RemoveFoldersElements(ref children);
if (tempNode != null)
rootNode.Children.Add(tempNode);
rootNode.Children.RemoveAt(i);
}
else
{
RemoveFoldersElements(ref children);
}
}
}
}
return null;
}
但不是成功,因为并非所有 Type_FOLDER 节点都被擦除(它跳转一级)! 有什么想法吗?
【问题讨论】:
-
你可以递归每个节点,构建所有文件的列表,然后将它们作为子节点添加到最后吗?如果您只关心顺序而不关心层次结构,似乎您正在尝试做太多的工作。
-
这是一种惰性模式。我想过滤具有各种类型项目(不仅是文件)的这棵树
-
您的示例使用了文件和文件夹,因此我在该上下文中做出了回应。我不明白什么是“懒惰模式”,在递归时将过滤器应用于孩子,并且只使用您想要的类型构建列表。
标签: c# algorithm data-structures recursion tree