문제

대기열을 사용하여 폭을 먼저 검색하고 싶습니다.

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# 컬렉션이 있다고 생각하지 않습니다.

다른 팁

그만큼 각각 구조물은 여기서 작동하지 않습니다.

색인 액세스를 제공하는 컨테이너를 사용하여 문제를 해결할 수 있습니다.

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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top