我想使用队列
对树进行广度优先搜索var q = new Queue<T>();
q.Enqueue(Root);
foreach(T root in q)
{
foreach(T t in root.Children)
q.Enqueue(t);
}
但是我得到了“在枚举器实例化后修改了集合”。异常。
我可以使用C#类型吗?
编辑:一点点阅读让我觉得我可能做错了。
有没有办法使用foreach从队列中出队?
这可行,但很难看(OMHO)
var q = new Queue<T>();
q.Enqueue(Root);
while(q.Count > 0)
{
T root = q.Dequeue();
foreach(T t in root.Children)
q.Enqueue(t);
}
答案 0 :(得分:8)
您无法枚举IEnumerable并同时更改相同的IEnumerable。我不认为有一个C#Collection会允许这样做。
答案 1 :(得分:2)
foreach 构造在这里不起作用。
您可以使用提供索引访问的容器来解决问题。
var l = new List<T>();
l.Add(Root);
int i = 0;
while(i < l.Count)
{
T root = l[i];
foreach(T t in root.Children)
{
l.Add(t);
}
++i;
}
// And because you really wanted a queue
var q = new Queue<T>(l);