遍历一个列表,该列表有另一个列表,另一个列表有另一个列表等
Iterate through a list that has another list that has another list etc
所以我有一个特定的列表 class 我已经定义了 IList<Element> A;
元素 class 有 IList<Children> b;
B 列表从文件中获取数据。
B 可能有一个列表,其中包含一个包含列表等的列表... "Recursively"
或者 B 只能有一个列表
即 B 嵌套列表可能会有所不同
我想遍历所有列表。有没有办法做到这一点?
朴素方法只是堆栈递归——它适用于许多常见场景:
class A {
List<B> _theList;
void DoTheThing() {
foreach(var b in _theList) b.DoTheThing();
}
}
class B {
List<B> _innerItems;
void DoTheThing() {
DoTheThingAtThisLevel();
// and now recurse
foreach(var inner in _innerItems) inner.DoTheThing();
}
}
这可能对于非常深的列表来说是个问题——因为堆栈可能变得太大;在这种情况下,使用本地队列或堆栈并使用 that 作为逻辑状态可以避免:
class A {
List<B> _theList;
void DoTheThing() {
var queue = new Queue<B>();
foreach (var b in _theList)
queue.Enqueue(b);
while (queue.Count != 0)
{
var b = queue.Dequeue();
b.ProcessThisLevelOnly();
// now we do the logical recursion here
foreach (var inner in b.Items)
queue.Enqueue(inner);
}
}
}
您可以根据深度优先或广度优先使用堆栈与队列。
所以我有一个特定的列表 class 我已经定义了 IList<Element> A;
元素 class 有 IList<Children> b;
B 列表从文件中获取数据。 B 可能有一个列表,其中包含一个包含列表等的列表... "Recursively" 或者 B 只能有一个列表 即 B 嵌套列表可能会有所不同
我想遍历所有列表。有没有办法做到这一点?
朴素方法只是堆栈递归——它适用于许多常见场景:
class A {
List<B> _theList;
void DoTheThing() {
foreach(var b in _theList) b.DoTheThing();
}
}
class B {
List<B> _innerItems;
void DoTheThing() {
DoTheThingAtThisLevel();
// and now recurse
foreach(var inner in _innerItems) inner.DoTheThing();
}
}
这可能对于非常深的列表来说是个问题——因为堆栈可能变得太大;在这种情况下,使用本地队列或堆栈并使用 that 作为逻辑状态可以避免:
class A {
List<B> _theList;
void DoTheThing() {
var queue = new Queue<B>();
foreach (var b in _theList)
queue.Enqueue(b);
while (queue.Count != 0)
{
var b = queue.Dequeue();
b.ProcessThisLevelOnly();
// now we do the logical recursion here
foreach (var inner in b.Items)
queue.Enqueue(inner);
}
}
}
您可以根据深度优先或广度优先使用堆栈与队列。