2016-05-29 2 views
-1

Есть цикл вроде этого:C# цикл, где коллекция была изменена

List<Category> categories = new List<Category>(); 

foreach(Category category in categories) 
{ 
    ... 

    if(...) 
    { 
     Category subcategory = new Category(); 

     ... 

     categories.Add(subcategory); 
    } 
} 

Проблема в том, конечно, что коллекция петель (категории) не любит быть изменен, пока он работает, но мне нужно сделать то же самое относится к подкатегориям, как и к категориям, которые я должен начать.

Это единственный способ сделать это - или есть более умный способ сделать это?

List<Category> categories = new List<Category>(); 
List<Category> subcategories = new List<Category>(); 

foreach(Category category in categories) 
{ 
    ... 

    if(...) 
    { 
     Category subcategory = new Category(); 

     ... 

     subcategories.Add(subcategory); 
    } 
} 

foreach(Category subcategory in subcategories) 
{ 
    ... 
} 

Спасибо.

+0

Вы действительно должны включить [mcve], когда вы отправляете вопрос. Я должен иметь возможность скопировать и запустить ваш код с минимальными усилиями. Прямо сейчас ваш код не компилируется и затрудняет тестирование альтернатив. – Enigmativity

ответ

0

Поскольку вы редактируете коллекцию, ошибки кода как их в состоянии, которое невозможно определить. Чтобы обойти эту проблему, используйте цикл вместо Еогеаспа, и уменьшает Ваш подсчет вручную, как:

for (int i = 0; i < categories.count; i++) 
{ 
    ... 
    if(...) 
    { 
     Category subcategory = new Category(); 
     ... 
     categories.Add(subcategory); 
     i--; 
    } 
} 
1

Это звучит как обходе дерева заказа уровня. Рассмотрим использование очереди:

Смежные вопросы