List Item entfernen (Enumeration)

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von fichz.

    List Item entfernen (Enumeration)

    Guten Abend allerseits,

    ich habe eine List(of Object) und gehe diese in einer for each schleife durch.

    Wenn ich nun ein Item aus der Liste lösche, müsste ich die List neu sortieren und enumerieren. Natürlich müsste ich nach der Löschung die for schleife verlassen, da sonst ein Fehler auftritt. Wie könnte ich auf elegantem Wege ein Item aus der Liste löschen und diese neu sortieren und indexieren?

    Beispiel:

    VB.NET-Quellcode

    1. For Each card As Cards In cardobjectspl
    2. '...........
    3. cardobjectspl.RemoveAt(countcards)
    4. Exit For
    5. '...........
    6. Next
    Du musst ja nicht sofort die Schleife verlassen, oder?

    Iteriere durch, lösche was zu löschen ist und dann, wenn der Schleifendurchgang beendet ist, sortiere.

    Im Übrigen , wieso verwendest du ForEach?

    Mach es mit einer invertierten ForSchleife:

    VB.NET-Quellcode

    1. For i = cardobjectspl.Count - 1 To 0 Step - 1

    Dann kriegst du auch kein Fehler, weil sich irgend eine Auflistung geändert habe.
    Und Gott alleine weiß alles am allerbesten und besser.
    Eh,

    VB.NET-Quellcode

    1. For i = cardobjectspl.Count - 1 To 0 Step - 1

    ist eine Schleife die die Variable "i" runterzählt(bis 0).

    Eine Liste kann über seinen Index(ähnlich wie Arrays) angesprochen werden(hat einen Indexer).

    VB.NET-Quellcode

    1. For i = cardobjectspl.Count - 1 To 0 Step - 1
    2. cardobjectspl.RemoveAt(countcards)
    3. //cardobjectspl(i) gibt das Item wieder
    4. Next

    Und Gott alleine weiß alles am allerbesten und besser.

    Schmandal schrieb:

    Wenn ich nun ein Item aus der Liste lösche, müsste ich die List neu sortieren und enumerieren
    Wieso? War die Liste vorher nicht sortiert?
    Wenn sie sortiertz war, ist sie hinterher immer noch sortiert.
    Oder gibt es da eine andere Sortierung?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    φConst schrieb:

    ist eine Schleife die die Variable "i" runterzählt(bis 0).


    Ja, das ist mir durchaus bewusst. Doch wenn ich das genauso handle, und das Item remove, bekomme ich beim nächsten Durchlauf:

    An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll
    Additional information: Der Index lag außerhalb des Bereichs. Er darf nicht negativ und kleiner als die Auflistung sein.

    Also muss ich ja entweder die Schleife verlassen, oder erst alles durchlaufen, den Index speichern und ihn danach separat löschen. Oder ich verstehe gerade nicht was ihr meint... bisher habe ich dies hier:

    VB.NET-Quellcode

    1. For i = cardobjectspl.Count To 0 Step -1
    2. Dim card As Cards = CType(cardobjectspl(i - 1), Cards)
    3. If (e.X >= card.xcard And e.X <= card.xcard + CInt(standardx)) And e.Y >= card.ycard And e.Y <= card.ycard + CInt(standardy) Then
    4. '... Code...
    5. If card.cardranges = "siege" Then
    6. '... Code...
    7. cardobjectspl.RemoveAt(i)
    8. End If
    9. '...Code...
    10. End If
    11. Next


    .... Der Code funktioniert, die Karte wird aus der Liste entfernt, aber danach kommt eben oben genannter Fehler.

    Schmandal schrieb:

    beim nächsten Durchlauf
    Klar.
    Du musst die Schleife von hinten nach vorn (rückwärts) durchlaufen, denn wenn Du beim Hochzählen ein Item entfernst, stimmen die Indizes nicht mehr.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!