2017-12-30 44 views
-5

mein Projekt ist über eine Klasse Konto und 2 Kinderklassen (Girokonto und Depot).System.InvalidOperationException in meinem C# -Projekt

im Haupt habe ich eine Arraylist von Konten aber ich versuche, ein Objekt in dieser Methode zu löschen:

public static void Remove(ArrayList L, int accnb) 
    { 
     foreach(Account obj in L) 
     { 
      if(obj.AccN == accnb) 
       L.Remove(obj); 
     } 
    } 

aber ich habe einen Fehler: Sammlung modifiziert wurde; Aufzählungsoperation wird möglicherweise nicht ausgeführt.

alle anderen Methoden wie String hinzufügen oder zurückgeben fein gearbeitet ..

Antwort

0

Sie nicht Elemente entfernen, während mit einem foreach über die Sammlung iterieren.

Auch würde ich empfehlen, List<T> anstatt ArrayList zu verwenden.

Ein einfacher Weg, um die Aufgabe zu lösen, ist einfach zu tun:

public static void Remove(List<Account> L, int accnb) => 
          L.RemoveAll(obj => obj.AccN == accnb); 
0

Die Elemente in einem ArrayList als object eingegeben werden. Daher weiß C# nicht, dass sie ein Mitglied mit dem Namen AccN haben.

Es gibt ein stark typisiertes, generisches Äquivalent von ArrayList mit dem Namen List<T>. Hier geben Sie die Art der Listenelemente explizit, wenn Sie die Liste mit

List<Account> accounts = new List<Account>(); 

Diese Liste erstellen auch Objekte der abgeleiteten Klassen CurrentAccount und DepositAccount enthalten. Verwenden Sie es wie folgt

public static void Remove(List<Account> L, int accnb) 
{ 
    foreach(Account acc in L) 
    { 
     if(acc.AccN == accnb) 
      L.Remove(acc); 
    } 
} 

Hinweis: in C# 1.0 und C# 1.1 gab es keine Generika. Daher wurde die schwach typisierte Sammlung ArrayList implementiert. Da Generika in C# 2.0 eingeführt wurden, ist dieser Typ meist veraltet.

Mit ArrayList würden Sie das Objekt auf die richtige Art werfen müssen, um es

if(((Account)acc).AccN == accnb) 

Sie haben auch ein anderes Problem funktioniert. Sie können nicht genau die Auflistung ändern, die Sie mit foreach aufzählen, da dies foreach verwirrt. Verwenden Sie stattdessen eine for-Schleife, und stellen Sie sicher, dass Sie die Schleife in umgekehrter Reihenfolge ausführen, damit beim Entfernen von Elementen die Indizes der Elemente nicht geändert werden.

for (int i = L.Count - 1; i >= 0; i--) { 
    if (L[i].AccN == accnb) { 
     L.RemoveAt(i); 
    } 
} 

Die C# Reference sagt:

Die foreach Anweisung verwendet wird, durch die Sammlung iterieren um die Informationen zu erhalten, die Sie wollen, aber nicht verwendet werden kann, um Elemente aus der Quellensammlung hinzufügen oder entfernen Vermeiden Sie unvorhersehbare Nebenwirkungen. Wenn Sie Elemente aus der Quellensammlung hinzufügen oder daraus entfernen möchten, verwenden Sie eine for-Schleife.

+0

aah okk Ursache Liste funktioniert nicht, ich habe einen Fehler Der Typ oder Namespacename 'Liste' wurde nicht gefunden (fehlt eine using-Direktive oder eine Assemblyreferenz? –

+0

Fügen Sie 'using System.Collections.Generic 'an der Spitze Ihres Codes oder verwenden Sie die Glühbirne, die es für Sie tut. –

+0

es funktioniert nicht:/Ich versuche die Antwort über Sie funktioniert, aber es ist neu für mich –

0

foreach funktioniert eigentlich nicht mit Sammlungen, aber mit Enumerators.Während alle Auflistungen implizit in einen Enumerator konvertiert werden können, gelten die Enumeartor-Regeln weiterhin.

Also im Grunde ist der Code interpretiert als:

temp IEnumerator = L.GetEnumerator(); 
 
foreach(Account obj in temp)

Alle Aufzählungen der Regel haben die zugrunde liegende Auflistung, die Sie kann nicht ändern. Andernfalls wird der Enumerator ungültig (muss). Wich wird gesagt, außer dem nächsten Anruf von .Current().

Da Sie die Auflistungen nicht ändern können, während Sie einen Enumerator verwenden, und foreach nur Enumerators unterhalb der Haube verwendet, bedeutet dies, dass Sie die colelciton (einschließlich Entfernen von Elementen) während der Verwendung von foreach nicht ändern können. Sie benötigen eine der viel mehr worry Loops, um dies zu tun.

Verwandte Themen