首页 > 解决方案 > IEnumerable 给出错误异常处理无法读取列表

问题描述

我希望代码显示有多少辆货车以及每辆货车中有哪些动物。这是我的错误:

System.InvalidOperationException: "The collection has been changed. The inventory processing may not be performed. "

这是代码:

public IEnumerable<Animal> GetAnimals()
{
    return Animals.AsEnumerable();
}
public void Checker(List<Animal> listAnimals)
{
    foreach (Animal animal in listAnimals)
    {
        foreach (Wagon wagon in Wagons)
        {
            foreach (Animal wagonAnimal in wagon.GetAnimals())
            {
                if (wagon.StartCapacity <= wagon.MaxCapacity &&
                    animal.Formaat + wagon.StartCapacity <= wagon.MaxCapacity &&
                    wagonAnimal.Eater == Eater.carnivoor &&
                    animal.Eater == Eater.herbivoor &&
                    animal.Formaat >= wagonAnimal.Formaat)
                {
                    wagon.AddAnimal(animal);
                    Wagons.Add(wagon);    
                }
                else
                {
                     Wagon waggi = new Wagon();
                     waggi.AddAnimal(animal);
                     Wagons.Add(waggi);
                }
            }
        }

        Wagon wag = new Wagon();
        wag.AddAnimal(animal);
        Wagons.Add(wag);
    }
}

谁能给我一些关于这个问题的提示?

标签: c#ienumerable

解决方案


如果您希望在循环时修改集合,我会使用List对象而不是IEnumerable.

一些示例代码如下所示:

List<Wagons> Wagons = new List<Wagons>
Wagons.AddAnimal(animal1);

foreach(Animal animal in Wagons.GetAnimals(){
   animal.Eater = Eater.herbivore;
}

还要查看您的代码:

if (wagon.StartCapacity <= wagon.MaxCapacity &&
    animal.Formaat + wagon.StartCapacity <= 
    wagon.MaxCapacity && wagonAnimal.Eater == Eater.carnivoor &&
    animal.Eater == Eater.herbivoor && animal.Formaat >= wagonAnimal.Formaat)
{
    wagon.AddAnimal(animal);
    Wagons.Add(wagon);
} else {
    wagon.AddAnimal(animal);
    Wagons.Add(wagon);
}

这个 if/else 语句执行完全相同的代码,因此您真的不需要 if/else,您只需添加动物并添加马车。

最后,您的方法的参数是否不应该接受货车而不是动物的List集合IEnumerable,以便您可以循环浏览货车并查看货车中的动物?


推荐阅读