首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IEnumerable给出错误异常处理不能读取列表

IEnumerable给出错误异常处理不能读取列表
EN

Stack Overflow用户
提问于 2019-03-27 12:50:07
回答 3查看 96关注 0票数 1

我想要代码显示有多少辆货车和哪些动物在每辆马车上。这是我的错误:

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

这是代码:

代码语言:javascript
复制
public IEnumerable<Animal> GetAnimals()
{
    return Animals.AsEnumerable();
}
代码语言:javascript
复制
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);
    }
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-27 15:14:35

您不能在使用foreachin迭代列表时修改它。

示例:

代码语言:javascript
复制
foreach (Wagon wagon in Wagons)
{
    Wagon waggi = new Wagon();
    Wagons.Add(waggi);
}

都不管用。

如果你用。

代码语言:javascript
复制
// 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/6HXYmIhttps://gist.github.com/SeppPenner/a082062d3ce2d5b8196bbf4618319044 )。

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

票数 0
EN

Stack Overflow用户

发布于 2019-03-27 13:00:29

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

一些示例代码如下所示:

代码语言:javascript
复制
List<Wagons> Wagons = new List<Wagons>
Wagons.AddAnimal(animal1);

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

还查看您的代码:

代码语言:javascript
复制
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,只需添加动物和添加旅行车即可。

最后,您的方法的参数不应该接受由货车而不是动物组成的ListIEnumerable集合,这样您就可以遍历货车,并查看货车中的动物了吗?

票数 1
EN

Stack Overflow用户

发布于 2019-03-27 13:01:37

实际上,您不能在循环时修改列表。您需要创建另一个对象,并分别添加马车和动物。如果你还不明白的话,试试这个,然后评论一下

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55377639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档