none
Indexverletzung beim Löschen einer Liste RRS feed

  • 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 entfernt
                      for (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
    Freitag, 28. April 2017 18:02

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
    Freitag, 28. April 2017 18:58
  • 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
    Freitag, 28. April 2017 18:19

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
    Freitag, 28. April 2017 18:19
  • 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
    Freitag, 28. April 2017 18:33

  • 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
    Freitag, 28. April 2017 18:58
  • Merci beaucoup für die Erläuterung und das richtige Schleifenkonstrukt!

    Habe demzufolge beide Antworten als hilfreiche Antwort markiert und beende hiermit diesen Thread.

    Happy coding!

    Samstag, 29. April 2017 07:13