【问题标题】:inserting into a queue while enumerating it在枚举队列时插入队列
【发布时间】:2009-03-02 23:23:11
【问题描述】:

我想使用队列对树进行广度优先搜索

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);
}

【问题讨论】:

  • 您的工作示例有效地在做什么?除非我遗漏了什么,否则您只是不断地添加然后删除项目,最终以一个空队列结束。是否应该在“出队”命令之后进行处理?

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


【解决方案1】:

您不能在枚举 IEnumerable 的同时更改相同的 IEnumerable。我认为没有 C# Collection 允许这样做。

【讨论】:

  • Observable.ToEnumerable() :)
【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多