我想要代码显示有多少辆货车和哪些动物在每辆马车上。这是我的错误:
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);
}
}有人能给我一些关于这个问题的提示吗?
发布于 2019-03-27 15:14:35
您不能在使用foreach和in迭代列表时修改它。
示例:
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://learn.microsoft.com/en-US/dotnet/csharp/programming-guide/inside-a-program/coding-conventions的定义检查您的代码样式。
发布于 2019-03-27 13:00:29
如果您希望在循环时修改集合,我将使用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/ and语句执行完全相同的代码,所以您实际上不需要if/and,只需添加动物和添加旅行车即可。
最后,您的方法的参数不应该接受由货车而不是动物组成的List或IEnumerable集合,这样您就可以遍历货车,并查看货车中的动物了吗?
发布于 2019-03-27 13:01:37
实际上,您不能在循环时修改列表。您需要创建另一个对象,并分别添加马车和动物。如果你还不明白的话,试试这个,然后评论一下
https://stackoverflow.com/questions/55377639
复制相似问题