2009-03-02 27 views
0

我想用一個隊列插入到隊列中,同時枚舉它

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

你的工作示例有效地做了什麼?除非我錯過了某些東西,否則你會不斷添加然後移除項目,最終會以空隊列結束。是否應該在「出列」命令之後進行處理? – 2009-03-02 23:39:42

回答

8

您不能枚舉一個IEnumerable和更改相同的IEnumerable在同一時間。我不認爲有一個C#集合將允許這樣做。

+0

`Observable.ToEnumerable()`:) – Benjol 2013-10-09 12:49:36

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