在枚举时插入队列

时间:2009-03-02 23:23:11

标签: c# data-structures queue breadth-first-search

我想使用队列

对树进行广度优先搜索
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);
}

2 个答案:

答案 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);