-
03-07-2019 - |
题
我想使用队列
对树进行广度优先搜索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);
}
解决方案
您无法枚举IEnumerable并同时更改相同的IEnumerable。我不认为有一个C#Collection会允许这样做。
其他提示
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);
不隶属于 StackOverflow