0

それでは、リスト変数を含む this クラス T があるとしましょう。リスト内のすべてのアイテムを調べてから、リストの各アイテム内のすべてのアイテムなどを、すべてのアイテムが処理されるまで調べるにはどうすればよいですか? 再帰メソッドを使用してこれを行う方法は知っていますが、それ自体を呼び出す再帰メソッドを使用しない方法があるかどうか疑問に思っています。質問がわかりにくい場合は申し訳ありませんが、フォルダーを使用したより良い例は次のようになります

Folder1 > Folder2、Folder3、Folder4 を含む

Folder2 > Folder5、Folder6 を含む

Folder5 > contains Folder7

Folder3 > Folder8、Folder9 を含む

Folder9 > contains Folder10

  Folder10 > contains Folder11

これらすべてのフォルダーを順番に繰り返し処理したいと思います (f1、f2、f5、f7、f6、f3、f8、f9、f10、f11、f4)。

これはもっと理にかなっていますか?ありがとう。

4

4 に答える 4

2

これは仕事をするはずです:

Stack stack;
stack.Push(root folder);
while (stack.Count > 0)
{
    Folder f = stack.Pop();
    foreach (Folder subf in f in reverse order)
        stack.Push(subf);
}
于 2013-03-30T16:36:36.337 に答える
1

あなたが言及した順序が重要であり、正確に従う必要がある場合、問題は単純なツリーに対する深さ優先検索になります。これは有名なアルゴリズムであり、それを解決する方法を見つけることができますが、パフォーマンスの良いアルゴリズムは反復アルゴリズムです。

于 2013-03-30T15:37:00.580 に答える
1
static IEnumerable<T> RecursiveEnumerator<T>( IEnumerable root ) {
     if (root is T) yield return (T)root;
     foreach (var item in root) {
         if (item is IEnumerable) {
             foreach (var result in RecursiveEnumerator<T>( (IEnumerable)item )) {
                 yield return result;
             }
         } else {
              if (item is T) yield return (T)item;
         }
     }
     yield break;
 }

 static IEnumerable<T> NonRecursiveEnumerator<T>( T root ) {
     Stack<T> Stack = new Stack<T>( );
     Stack.Push( root );

     do {
         root = Stack.Pop( );
         if (root is T) yield return (T)root;          
         if (root is IEnumerable)
            foreach (var item in ((IEnumerable<T>) root).Reverse()) 
               Stack.Push(item);
     } while (Stack.Count > 0);
     yield break;
  }

T は、次のようなインターフェイスにする必要があります。

interface IStorageElement {
    string Name {get}
}
于 2013-03-30T15:00:34.123 に答える
0

foreach の使用をお勧めします。例えば

foreach(List node in T)
    foreach(List folders in node)
        //do stuff
于 2013-03-30T14:56:01.410 に答える