Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#: Virhe foreach-silmukassa

Sivun loppuun

AtskaFin [24.04.2019 22:35:47]

#

Alla oleva koodinpätkä heittää seuraavan poikkeuksen:

Unhandled Exception: System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
   at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
   at Pathfinding_AI.components.pathfinder.start() in C:\Users\attek\source\repos\Pathfinding_AI\Pathfinding_AI\components\pathfinder.cs:line 36
   at Pathfinding_AI.Program.Main(String[] args) in C:\Users\attek\source\repos\Pathfinding_AI\Pathfinding_AI\Program.cs:line 19
AI.start(); //rivin 19 koodi luokassa Program

// pathfinder.cs
public void start()
        {
            bool isPathFinded = false;

            while (!isPathFinded)
            {
                foreach (string scanner in scanners) // rivi 36
                {
                    string[] parts = scanner.Split(" ");
                    int x = int.Parse(parts[0]);
                    int y = int.Parse(parts[1]);
                    string ways = nextStage(scanner);
                    if (ways.Contains('6')) isPathFinded = true;
                    if (ways.Contains('1') && !newScanners.Contains($"{ x } { y-- }")) newScanners.Add($"{ x } { y-- }");
                    if (ways.Contains('2') && !newScanners.Contains($"{ x++ } { y }")) newScanners.Add($"{ x++ } { y }");
                    if (ways.Contains('3') && !newScanners.Contains($"{ x } { y++ }")) newScanners.Add($"{ x } { y++ }");
                    if (ways.Contains('4') && !newScanners.Contains($"{ x-- } { y }")) newScanners.Add($"{ x-- } { y }");
                    allObjects.Add(scanner);
                    checkedAreas.Add(scanner);
                }
                scanners = newScanners;
                drawGrid();
            }
        }

En vain keksi ratkaisua tähän. Kokeilin erikseen foreach:in tilalle for -looppia, mutta ohjelmassa ei tapahdu mitään (se ei siis kaadu, mutta mitään ei tapahdu).

Huomenna ajattelin jatkaa, mutta mietin tietäisikö joku, mikä voisi olla mahdollinen syy.

Grez [24.04.2019 23:02:41]

#

Syyhän sanotaan tuossa virheilmoituksessa, kokoelman läpikäynti epäonnistuu, koska kokoelmaa muutetaan kesken läpikäynnin.

Itse scanners-kokoelman muokkaus ei näy tuosta osasta koodia, jonka laitoit näkyville, joten sen tarkemmin ei oikein pysty kommentoimaan.

AtskaFin [24.04.2019 23:26:23]

#

Kyllä ymmärsin itsekin, että mitä tuo poikkeus tarkoittaa. En vain löytänyt kohtaa, missä se muuttaa luokkaa foreach:in aikana

Metabolix [25.04.2019 05:25:44]

#

While-silmukassa asetat scanners = newScanners, minkä jälkeen nämä ovat siis sama asia ja foreach kaatuu muokkaukseen. Kannattaisi varmaan luoda uusi newScanners aina ennen foreach-silmukkaa.

AtskaFin [25.04.2019 06:42:07]

#

Pääsen vasta illalla testaamaan tuota. Itse olin yrittänyt etsiä ongelmaa foreach - loopin sisältä ja sen kutsumista metodeista.

Toimiikohan tämä:

scanners = new List<string>(newScanners);
newScanners = new List<string>();

Metabolix [25.04.2019 08:41:13]

#

Siis voit tietenkin sijoittaa ensin uuden listan vanhan tilalle ja sitten luoda vain yhden uuden.

scanners = newScanners;
newScanners = new List<string>();

maka78 [25.04.2019 20:28:11]

#

Niin ekalla kerralla tuo while loopin sisällä oleva foreach menee läpi, mutta kuten edellä mainittiin, sen jälkeen kerrot että scanner = newScanner (jota käpistelet foreachin sisällä) - homma kosahtaa seuraavalla while iteraatiolla.

Riittäis varmasti ihan se, että alustat tuon newScanners:in ennen foreach looppia.

newScanners = new List<string>();
foreach (string scanner in scanners) // rivi 36
{
       ....
}

Toinen ratkaisu on sitten tuon foreach silmukan jälkeen sijoittaa kopio newScanners:ista scanners:iin, jota tuossa pähkäsitkin.

while (!isPathFinded)
           {
               foreach (string scanner in scanners) // rivi 36
               {
                  ...
               }
               scanners = new List<string>(newScanners);
               drawGrid();
           }

AtskaFin [26.04.2019 09:54:27]

#

Löysin myös muualta koodista muutamia virheitä, mutta nyt ohjelma toimii.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta