IEnumerable给出错误异常处理无法读取列表

时间:2019-03-27 12:50:08

标签: c# 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);
    }
}

有人可以给我一些关于这个问题的提示吗?

3 个答案:

答案 0 :(得分:1)

如果您要在循环时修改集合,我将使用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,只需添加动物并添加旅行车即可。

最后,您方法的参数是否不接受ListIEnumerable的旅行车而不是动物的集合,以便您可以遍历旅行车,并查看旅行车中的动物? / p>

答案 1 :(得分:0)

实际上,您无法在循环时修改列表。 您需要创建另一个对象并分别添加货车和动物。 尝试此操作,如果您还不了解,请发表评论

答案 2 :(得分:0)

使用foreachin遍历列表时,无法修改列表。

示例:

foreach (Wagon wagon in Wagons)
{
    Wagon waggi = new Wagon();
    Wagons.Add(waggi);
}

不起作用。

如果您使用例如

// This is needed to not get an endless loop (Because the length of the list
// increases after each time the Add() method is called to Wagons.)
int wagonCount = Wagons.Count;

for (int i = 0; i < wagonCount ; i++)
{
    Wagon waggi = new Wagon();
    waggi.AddAnimal(animal);
    Wagons.Add(waggi);
}

这将起作用。

我的代码工作示例(据我所知,您可以在这里进行操作: https://dotnetfiddle.net/6HXYmI和此处:https://gist.github.com/SeppPenner/a082062d3ce2d5b8196bbf4618319044

我还建议根据Microsoft https://docs.microsoft.com/en-US/dotnet/csharp/programming-guide/inside-a-program/coding-conventions的定义检查您的代码样式。