열거하는 동안 대기열에 삽입
-
03-07-2019 - |
문제
대기열을 사용하여 폭을 먼저 검색하고 싶습니다.
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);
제휴하지 않습니다 StackOverflow