IEnumerable выдает ошибку исключения, handeling не может прочитать список - PullRequest
1 голос
/ 27 марта 2019

Я хочу, чтобы код показывал, сколько есть вагонов и какие животные находятся в каждом вагоне. Это моя ошибка:

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 ]

1 голос
/ 27 марта 2019

Если вы хотите изменить коллекцию во время цикла, я бы использовал объект 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 коллекцию вагонов, а не животных, чтобы вы могли проходить по вагонам и просматривать животных в вагонах?

0 голосов
/ 27 марта 2019

Вы не можете изменять список, перебирая его, используя 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://docs.microsoft.com/en-US/dotnet/csharp/programming-guide/inside-a-program/coding-conventions.

0 голосов
/ 27 марта 2019

На самом деле вы не можете изменить список во время цикла. Вам нужно создать еще один объект и добавить фургон и животных соответственно. Попробуйте и прокомментируйте, если вы еще не поняли

...