C#递归地遍历T列表中的项目,其中T具有T的列表

时间:2013-03-30 14:39:26

标签: c# methods recursion

所以,假设我有一个包含List变量的T类。如何查看List中的所有项目,然后查看List中每个项目内的所有项目,依此类推,直到每个项目都被处理完毕?我知道如何使用递归方法做到这一点,但我想知道是否有一种方法没有使用调用自身的递归方法。很抱歉,如果问题令人困惑,使用文件夹的更好示例可以是

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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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}
}

答案 2 :(得分:1)

如果您提到的订单很重要并且必须严格遵守,那么您的问题将是Depth First Search一个简单的树。它是一个着名的算法,你可以找到如何解决它,但具有良好性能的算法是一个迭代算法。

答案 3 :(得分:0)

我建议使用foreach。例如

foreach(List node in T)
    foreach(List folders in node)
        //do stuff