Benutzer mit den meisten Antworten
Indexverletzung beim Löschen einer Liste

Frage
-
Hallo Leute, in meiner Liste 'Buchungen' befinden sich genau sieben Elemente des Datentyp <string>.Das wurde mir durch Buchungen.Count() im Debugger auch bestätigt!
Folgende Schleifenkonstruktion führt zur folgenden Exception:
"der Index lag außerhalb des Bereiches.Er darf nicht negativ oder kleiner als die Auflistung sein".
Kurios dabei ist, daß sich immer noch Elemente in der Liste befinden.Woran liegt das nur. Der Fall bezieht sich auf anzahl_=0;
if (anzahl_ > 0) anzahl_+ = 6; for (int k = anzahl_; k <= anzahl_+6; k++) { Buchungen.RemoveAt(k); Console.WriteLine(k); } Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Flug wurde storniert"); Console.ForegroundColor = ConsoleColor.White;
Wenn ich den Gaul von hinten aufziehe,bekomme ich zwar keine Indexverletzung,dafür wird aber kein einziges Element aus der Liste entferntfor (int k = anzahl_+6; k<1; k--) { Buchungen.RemoveAt(k); Console.WriteLine(k); } Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Flug wurde storniert"); Console.ForegroundColor = ConsoleColor.White;
- Bearbeitet tklustig Freitag, 28. April 2017 18:20
Antworten
-
for (int k = anzahl_+6; k<1; k--)
... Wo liegt hier der Denkfehler?
Wenn dein Programm die Schleife startet, wird zuerst k initialisiert. Dann wird damit die Kondition geprüft und falls dies true ergibt, der Schleifenkörper ausgeführt. Da 6 aber nicht kleiner 1 ist wird die Schleife beendet, ohne einmal durchlaufen worden zu sein.
Gruß
- Als Antwort markiert tklustig Samstag, 29. April 2017 07:11
-
Hallo,
beim Löschen in einer Auflistung muss man von hinten - mit dem größten Index - anfangen. Denn wenn die Auflistung durch das Löschen Elemente vorne verliert, reduziert sich deren Anzahl und der Index kommt damit schnell außerhalb des gültigen Bereichs (oder man löscht die falschen Elemente).
Hier (unter Vorbehalt, dass anzahl_ stimmt):
for (int k = anzahl_ + 6; k >= anzahl_; k--)
Gruß Elmar
- Als Antwort markiert tklustig Samstag, 29. April 2017 07:11
Alle Antworten
-
Hallo,
beim Löschen in einer Auflistung muss man von hinten - mit dem größten Index - anfangen. Denn wenn die Auflistung durch das Löschen Elemente vorne verliert, reduziert sich deren Anzahl und der Index kommt damit schnell außerhalb des gültigen Bereichs (oder man löscht die falschen Elemente).
Hier (unter Vorbehalt, dass anzahl_ stimmt):
for (int k = anzahl_ + 6; k >= anzahl_; k--)
Gruß Elmar
- Als Antwort markiert tklustig Samstag, 29. April 2017 07:11
-
Funktioniert.
Daß ich den Gaul von hinten aufzäumen muss, ist mir durch den Debugger schnell klar geworden,dass allerdings das Schliefenkonstrukt
for (int k = anzahl_ + 6; k >= anzahl_; k--)
anstatt wie von mir eruiert:
for (int k = anzahl_+6; k<1; k--)
codiert werden muss,überrascht! Bin von folgender Überlegung ausgegangen:Startwert k=0+6=6,dann 5,dann 4,dann 3,dann 2, dann 1 und dann 0. Wo liegt hier der Denkfehler?
- Bearbeitet tklustig Freitag, 28. April 2017 18:34
-
for (int k = anzahl_+6; k<1; k--)
... Wo liegt hier der Denkfehler?
Wenn dein Programm die Schleife startet, wird zuerst k initialisiert. Dann wird damit die Kondition geprüft und falls dies true ergibt, der Schleifenkörper ausgeführt. Da 6 aber nicht kleiner 1 ist wird die Schleife beendet, ohne einmal durchlaufen worden zu sein.
Gruß
- Als Antwort markiert tklustig Samstag, 29. April 2017 07:11