Liste1 - Liste2 = liste3

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    Liste1 - Liste2 = liste3

    Guten Morgen leute :),

    wollte euch fragen ob es eine andere möglichkeit als folgende gibt :


    VB.NET-Quellcode

    1. For each wert in Liste1
    2. If not Liste2.conaints(wert) then
    3. Liste3.add(wert)
    4. end if
    5. Next


    Ich habe 3 Listen

    List1 2 und 3 Liste1 hat alle strings Liste2 die abgearbeiten strings und liste3 soll die nicht abgearbeiteten string bekommen am besten wäre ne lösung wie Liste3 = Liste1 - 2 xD

    danke im vorraus

    Lg Datsspeed :thumbup:

    datsspeed schrieb:

    okay aber auf net. 2 ebene gibt es nichts besseres / schnelleres?

    Die Frage ist eher was Du eigentlich vorhast: Du kannst doch mit einer Liste ToDo anfangen und dann abgearbeitete Elemente in die Liste Completed rübermoven.

    Wenn die Reihenfolge egal ist geht das simpel:

    VB.NET-Quellcode

    1. Dim toDo As New List(Of String)(New String() {"a", "b", "c"})
    2. Dim completed As New List(Of String)
    3. ' remove + adden
    4. completed.Add(toDo.Item(0))
    5. toDo.RemoveAt(0)
    auf die art und weise gehts leider nicht weil es dann wieder heißt der listenindex hat sich verändert und meine schleife würde abstürzen ^^

    ich arbeite eine schleife ab

    for each index in liste1

    mache dies und das
    falls du das machst
    erfolgreichabgehanelt in liste2

    next

    am ende will ich wissen welche indexe nicht erfolgreichw aren und die sollen dann in liste3 xD
    lg und danke ^^
    Plural von Index ist Indizes, nur mal so nebenbei.

    Wenn die Liste bereits in der Schleife abarbeitest, dann behandle entsprechende Einträge so wie von Kangaroo beschrieben. 2 mal die Liste durchlaufen ist mehr als nur unperfomant.

    Wegen dem Remove und dem daraus resultierenden Index-Error, du musst die Liste von unten nach oben durcharbeiten, dann ändert sich beim Remove auch kein Iindex.
    ich habe ja bereits eine copy von der liste zu dem zeitpunkt, ich habe aber festgestellt das ein remove die perfomance ziemlich runterzieht, aber um ehrlichzu sein müsst ich natürlich erst den removeat noch vesuchen habe nemlich bis jetzt nur den remove versucht...

    PS: wie gesagt habe des mit removeat versucht da schaffe ich nur 300indizes pro sekunde,
    anderweitig schaffe ich um die 10k oda so
    Remove() oder RemoveAt() ist identisch, einmal ist der Key ein Integer und einmal das Item, resultat ist das gleiche.

    Aber du solltest dir mal mehr ein Kopf machen, das gehört zum Programmieren nämlich umbedingt dazu, eine gewisse Logik.

    Was du machst:

    Quellcode

    1. Liste1 durchlaufen
    2. mache dies und das
    3. Erfolgreich in Liste2 kopieren
    4. Liste1 durchlaufen
    5. Prüfen ob das Item in Liste2 vorhanden ist
    6. wenn nein in Liste3 kopieren


    2 Mal eine Liste durchlaufen ist unperformant, zudem geht auch noch einige Zeit beim Contains verloren, weil dort ja auch nochmal die Liste2 durchgegangen wird um das Item zu suchen. Wieso machst du es nicht so??

    Quellcode

    1. Liste1 durchlaufen
    2. mache dies und das
    3. Erfolgreich Liste2 kopieren
    4. Nicht Erfolgreich Liste3 kopieren


    Macht doch irgendwie mehr Sinn oder meinst du nicht?

    Dodo schrieb:

    Wegen dem Remove und dem daraus resultierenden Index-Error, du musst die Liste von unten nach oben durcharbeiten, dann ändert sich beim Remove auch kein Iindex.

    Oder noch einfacher: benutze eine While Schleife statt For/ Next .... tja sowas gibts ;)

    VB.NET-Quellcode

    1. While todo.Count > 0
    2. ' tu was
    3. ...
    4. ' remove + adden
    5. completed.Add(toDo.Item(0))
    6. toDo.RemoveAt(0)
    7. End While