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.
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.
Kyllä ymmärsin itsekin, että mitä tuo poikkeus tarkoittaa. En vain löytänyt kohtaa, missä se muuttaa luokkaa foreach:in aikana
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.
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>();
Siis voit tietenkin sijoittaa ensin uuden listan vanhan tilalle ja sitten luoda vain yhden uuden.
scanners = newScanners; newScanners = new List<string>();
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(); }
Löysin myös muualta koodista muutamia virheitä, mutta nyt ohjelma toimii.
Aihe on jo aika vanha, joten et voi enää vastata siihen.