修改集合的C#循环

时间:2016-05-29 01:03:01

标签: c# loops collections

有这样的循环:

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

foreach(Category category in categories)
{
    ...

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

        ...

        categories.Add(subcategory);
    }
}

问题当然是循环集合(类别)在运行时并不喜欢被修改,但是我需要对子类别执行与对类别I完全相同的操作。必须从头开始。

这样做的唯一选择 - 还是有更明智的方法吗?

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)
{
    ...
}

感谢。

2 个答案:

答案 0 :(得分:1)

这听起来像是级别顺序树遍历。考虑使用队列:

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);
    }
}

答案 1 :(得分:0)

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

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