2009-03-02 4 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

효과적인 작업 사례는 무엇입니까? 내가 뭔가를 놓치지 않는 한, 당신은 계속적으로 아이템을 제거하고 궁극적으로 빈 큐로 끝납니다. "Dequeue"명령을 처리 한 후 처리해야합니까? –

답변

8

당신은는 IEnumerable을 통해 열거하고 동시에 같은 IEnumerable을 변경할 수 없습니다. 나는 이것을 허용 할 C# Collection이 없다고 생각한다.

+0

'Observable.ToEnumerable()':) – Benjol

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); 
관련 문제