所以,假设我有一个包含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)
这更有意义吗?感谢。
答案 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