更新以显示基于堆栈的方法:
List<String> result = new List<String>();
Stack<IEnumerator> nodeColls = new Stack<IEnumerator>();
IEnumerator nodes = treeViewTab4DirectoryTree.Nodes.GetEnumerator();
nodeColls.Push(null);
while (nodes != null)
{
while (nodes.MoveNext())
{
result.add(nodes.Current.FullPath);
if (nodes.Current.FirstNode != null)
{
nodeColls.Push(nodes);
nodes = nodes.Current.Nodes.GetEnumerator();
}
}
nodes = nodeColls.Pop();
}
下面的代码不像注释中提到的那样工作,因为它没有遍历整个树,而只取每个顶级分支的第一个叶子节点。
我实际上认为原始代码(在问题中)也是这样做的,因为我认为 Remove 实际上会在找到它下的第一个叶节点后删除顶层节点;但相反,它会尝试从顶级节点集合中删除叶节点,如果找不到它就忽略它。
原始帖子,无效代码
首先,为什么需要从列表中删除项目?
List<string> nodes = new List<string>();
foreach (TreeNode tn in treeViewTab4DirectoryTree.Nodes)
{
TreeNode temp = tn;
while (Temp.FirstNode != null)
{
Temp = Temp.FirstNode;
}
if (!nodes.Contains(Temp.FullPath))
{
nodes.Add(Temp.Text);
}
}
要回答您的具体问题,假设 Nodes 集合实现 IEnumerable,请使用:
List<TreeNode> nodeList = new List<TreeNode>(treeViewTab4DirectoryTree.Nodes);
如果您决定坚持使用 while 循环,则可以通过更改来保存实例化
TreeNode Temp = new TreeNode();
到
TreeNode Temp = null;
...您从未真正使用过您创建的对象,至少在您显示的部分代码中。