سؤال

أريد أن أقوم بعمل أول بحث عن شجرة باستخدام قائمة انتظار

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);
}
هل كانت مفيدة؟

المحلول

لا يمكنك التعداد أكثر من غير قابلة للتطبيق وتغيير نفسه في نفس الوقت. لا أعتقد أن هناك مجموعة 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