Item aus eine Liste beim Löschen Fehler

  • C#

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von EugenIS.

    Item aus eine Liste beim Löschen Fehler

    Hallo Leute und danke fürs reinschauen...


    kann mir jemand bei meinem Problem helfen?

    C#-Quellcode

    1. for (int i = Count - 1; i >= 0; i--)
    2. {
    3. if (this[i] != null)
    4. if (!this[i].Correctly)
    5. RemoveAt(i);
    6. }


    Wenn der bei 0 ankommt, erzählt der mir:

    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.


    Kann ich irgend wie die liste aktualisieren vorher?
    @EugenIS Was ist this für eine Klasse?
    Kannst Du mal ein kleines Beispielprogramm machen, das den Effekt reproduziert?
    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!
    @EugenIS Mach ein kleines Beispielprogramm.
    ObservableCollection mit 3 Einträgen, GUI-Anzeige, Button, der einen Eintrag ungültig macht.
    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!
    hm... ich kann jetzt schlecht hier die gesamte klasse posten. und nachgestellt kriege ich es nicht... naja. probiere ich mal weiter herum. ich dachte vielleicht kennt jemand so ein problem.

    Das lustige ist, wenn ich ein event auf die Liste setze (CollectionChanged) sehe ich, das ein Item gelöscht wird, und dann kommt er in exception rein. Spielt es vielleicht eine Rolle dass das ganze in einem Delegete geschieht?

    EugenIS schrieb:

    nachgestellt kriege ich es nicht
    Da bist Du Deinem Fehler absolut dicht auf der Spur. :thumbsup:
    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!
    Setz da nen Haltepunkt drauf, drücke Shift+F9, gib this ein und sieh Dir an, was da los ist.
    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!
    Nimm LINQ, du musst ja irgend ne interne Liste haben.
    ​list = list.Where(member => member != null && member.Correctly);
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Ich bin nun wirklich nicht der C#-Freak, aber könnte das hier gehen?

    C#-Quellcode

    1. foreach (WasWeissIch item in this.Items) {
    2. item.Remove();
    3. }


    In Deinem Beispiel in Post#1 legst Du eine Schleifendurchlaufhäufigkeit fest, die der Länge der Liste entspricht.
    Innerhalb der Schleife entfernst Du Items aus der Liste, sodass sich die Länger der Liste verändert, nämlich kürzer wird.
    Wenn z.B. die ursprüngliche Liste 3 Items lang war, und Du 1 item entfernt hast, ist die Länger der Liste nicht mehr 3, sonder nur noch 2 Items.
    Die Schleife läuft aber weiter ind will ein item adressieren, das es nicht mehr gibt.

    EugenIS schrieb:

    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Ich denke, diese Meldung ist damit erklärlich.
    Darum läuft er sie auch rückwärts.
    Die Fehlermeldung wäre auch eine andere. Die würde lauten Out Of Bounds oder sowas oder item not in list

    Helfen ist immer gut, genau lesen aber noch wichtiger ;)
    Das ist meine Signatur und sie wird wunderbar sein!
    Also ich habe es jetzt gelöst... Ich weiß auch nicht warum, aber ich habe Remove und RemoveAt Methoden in der Liste überschrieben. Komischerweise mache ich dort auch nichts anderes wie Remove, sprich base.Remove. Und der Fehler ist weg. Also so richtig schlüssig erklären kann ich mir das nicht. In Forums habe ich für das ungewöhnliche Verhalten auch keine Antwort gefunden. Wie dem auch sei, sind wir jetzt alle ein wenig klüger....