Liste erweitern während diese mit For Each durchlaufen wird?

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Liste erweitern während diese mit For Each durchlaufen wird?

    Hallo zusammen,

    ich bräuchte mal einen Tipp von euch. Es geht darum, dass ich eine Liste habe, deren Elemente ich mit einer For Each Schleife durchlaufe. Soweit, so gut. Es ist nun aber erforderlich, dass neue Elemente zu eben dieser Liste hinzugefügt werden sollen, und zwar während sie durchlaufen wird, damit die neu hinzugefügten Elemente quasi im gleichen Durchgang ebenfalls durchlaufen werden. Hintergrund ist der, dass ich eine hierarchische Baumstruktur durchgehen muss, die in Tabellenform vorliegt ([Eigene Id],[Parent Id]).

    Das Problem ist: ich bekomme keinen Fehler, aber die Elemente, die während des Durchlaufens hinzugefügt werden, werden nicht durchlaufen, sondern nur die Elemente, die zu Beginn der Schleife bereits vorhanden waren.

    Als kleine Veranschaulichung:

    MyList enthält die Elemente "Alice", "Bob", "Charlie"

    VB.NET-Quellcode

    1. For Each item as String in Mylist
    2. if item = "Bob" then MyList.Add("Danny")
    3. Next


    Die Liste wird nur dreimal durchlaufen, u.z. für Alice, Bob und Charlie. Danny bleibt draußen. Habt ihr da eine Idee?

    (Microsoft Visual Basic 2010)
    Willkommen im Forum. :thumbup:
    Die For Each-Syntax ist leider so, der Enumerator für diese Liste hat einen wohldefinierten Wertebereich, der zur For-Zeit ( :thumbsup: ) nicht erweitert werden kann.
    Du kannst mit Exit For oder Return das For Each verlassen und neu dann starten.
    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!
    Geht nicht mit For each.

    Ginge mit zB einer Do Loop Schleife.

    VB.NET-Quellcode

    1. Dim i As Integer = 0
    2. Do While MyList.Count < i
    3. If MyList.Item(i) = "Bob" Then MyList.Add("Danny")
    4. i += 1
    5. Loop
    Das ist meine Signatur und sie wird wunderbar sein!
    Eine möglichkeit wäre evtl eine extension, welche die funktionen des ienumerator überlädt oder diese überschreiben ... was aber nicht gehen dürfte glaube ich.

    Generell zur Funktion (wie for each geht) solltest du dir mal IEnumerator und IEnumerable angucken...

    Rob schrieb:

    Hintergrund ist der, dass ich eine hierarchische Baumstruktur durchgehen muss, die in Tabellenform vorliegt ([Eigene Id],[Parent Id]).

    kannst du das genauer erklären?

    Baumstrukturen durchläuft man meist rekursiv, aber es gibt eine iterative Alternative, bei der man mit einer Queue arbeitet, und die macht genau was dein Prob ist: während der Iteration werden neu gefundene Elemente zugefügt, und die abgearbeiteten rausgeschmissen.

    Was sind das für Datensätze, die mit den beiden Ids? Etwa eine DataTable? Also eine DataRow hat eine GetChildRows()-Funktion, sodaß eine rekursiv verknüpfte DataTable bereits eine Baumstruktur ist, und man u.U. keine daraus zu bilden braucht.