修改集合的C#循环

修改集合的C#循环,c#,loops,collections,C#,Loops,Collections,有这样一个循环: 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>();

foreach(Category category in categories)
{
    ...

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

        ...

        categories.Add(subcategory);
    }
}
列表类别=新列表();
foreach(类别中的类别)
{
...
如果(…)
{
类别子类别=新类别();
...
类别。添加(子类别);
}
}
当然,问题是循环集合(类别)不喜欢在运行时被修改,但我需要对子类别执行与我必须首先对类别执行的操作完全相同的操作

这样做是唯一的选择,还是有更聪明的方法

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)
{
    ...
}
列表类别=新列表();
列表子类别=新列表();
foreach(类别中的类别)
{
...
如果(…)
{
类别子类别=新类别();
...
子类别。添加(子类别);
}
}
foreach(子类别中的类别子类别)
{
...
}

谢谢。

由于您正在编辑该集合,因此代码错误将处于无法确定的状态。 要解决此问题,请使用for循环而不是foreach,并手动减少计数,如:

for (int i = 0; i < categories.count; i++)
{
    ...
    if(...)
    {
        Category subcategory = new Category();
        ...
        categories.Add(subcategory);
        i--;
    }
 }
for(int i=0;i
这听起来像是一个级别顺序树遍历。考虑使用队列:

var categoryList = GetMyInitialListOfCategories();

var categoryQueue = new Queue<Category>(categoryList);
while (categoryQueue.Count > 0)
{
    var category = categoryQueue.Dequeue();
    if (WeShouldMakeASubcategoryFromThis(category))
    {
        var subcategory = new Category();
        categoryList.Add(subcategory);
        categoryQueue.Enqueue(subcategory);
    }
}
var categoryList=GetMyInitialListOfCategories();
var categoryQueue=新队列(categoryList);
while(categoryQueue.Count>0)
{
var category=categoryQueue.Dequeue();
如果(我们应该以此(类别)为基础进行分类)
{
var子类别=新类别();
添加(子类别);
categoryQueue.Enqueue(子类别);
}
}
在发布问题时,您真的应该包括一个。我应该能够以最小的努力复制并运行您的代码。现在,您的代码无法编译,这使得测试替代方案变得困难。