スタックベースのアプローチを示すように更新されました:
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;
...少なくとも表示したコードの一部では、作成したオブジェクトを実際に使用することはありません。