الإدراج في قائمة انتظار أثناء تعداده
-
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);
}
المحلول
لا يمكنك التعداد أكثر من غير قابلة للتطبيق وتغيير نفسه في نفس الوقت. لا أعتقد أن هناك مجموعة 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);
لا تنتمي إلى StackOverflow