質問

キューを使用してツリーの幅優先検索を行いたい

var q = new Queue<T>();

q.Enqueue(Root);

foreach(T root in q)
{
  foreach(T t in root.Children)
    q.Enqueue(t);
}

ただし、列挙子がインスタンス化された後に「コレクションが変更されました」というメッセージが表示されます。例外。

これを実行できるC#型はありますか?


編集:少し読むと、私はこれをまったく間違っているかもしれません。

foreachを使用してキューからデキューする方法はありますか?


これは動作しますがisい(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#コレクションはないと思います。

他のヒント

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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top