2 Listboxen abgleichen und Inhalt Löschen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von RedfieId.

    2 Listboxen abgleichen und Inhalt Löschen

    Guten Tag
    liebe Freunde

    ich habe zwei listboxen
    die 2 unterschiedliche Ordner ermitteln
    in diesen Ordner sind Dateien mit selben Namen. Nun möchte ich gerne das die Namen die in Box1 und Box2 gleich sind aus den Boxen entfernt wird, so das nur noch die Namen in den Boxen sind die in den anderen nicht sind
    wie kann ich das machen

    ich schreibe auf VB.net
    Danke Gruß Red
    Schritt-für-Schritt-Erklärung:
    Du nimmst zwei List(Of T).
    T sollte IO.FileInfo sein, testweise alternativ String

    VB.NET-Quellcode

    1. Dim Liste1 As New List(Of String)
    2. Dim Liste2 As New List(Of String)

    Dann befüllst Du die Listen mit
    Liste1.AddRange(HierDasArrayDeinerDateinamen), entsprechend auch Liste2 befüllen.
    Dann Intersect:

    VB.NET-Quellcode

    1. Dim GleicheEinträge = Liste1.Intersect(Liste2).ToList

    Und dann eben diese gleichen Einträge aus den Listen entfernen, z.B. mit Except, einem weiteren LINQ-Bestandteil:

    VB.NET-Quellcode

    1. Dim VerbleibendeEinträgeAusListe1 = Liste1.Except(GleicheEinträge)

    Liste2 entsprechend.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wenn du die gleichen Einträge erst löschen möchtest, wenn sie sich schon in den Listboxen befinden, kannst du das auch so ähnlich machen.

    VaporiZed schrieb:

    Dim GleicheEinträge = Liste1.Intersect(Liste2).ToList


    VB.NET-Quellcode

    1. Public Sub Abgleich()
    2. For Each item As String In GleicheEinträge
    3. ListBox1.Items.Remove(item)
    4. ListBox2.Items.Remove(item)
    5. Next
    6. End Sub

    RedfieId schrieb:

    VB.NET-Quellcode

    1. ListBox2.Items.Contains(zeile)
    Was soll diese Zeile bewirken?
    Was bewirkt sie hingegen?
    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!
    @RedfieId: bitte CodeTags verwenden

    ListBox2.Items.Contains(zeile) ergibt so keinen Sinn. Das ist eine Funktion, die Dir zurückgibt, ob in den ListBox2.Items zeile enthalten ist. Da Du das aber nicht auswertest, ist diese Codezeile überflüssig.
    Außerdem stellt sich mir die Frage, ob die Aufgabe richtig beschrieben ist. Post#1 sagt:
    Aus ListBox1 mit "ABC", "DEF" und "GHI" und ListBox2 mit "ABC", "JKL", "MNO" soll werden:
    ListBox1 mit "DEF" und "GHI" und ListBox2 mit "JKL", "MNO"
    Die Duplikate fallen aus ListBox1 und ListBox2 weg. Dein Code sagt aber was anderes. Was soll wirklich geschehen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Tja, Glückwunsch. Du hast in Post#1 die Aufgabe falsch beschrieben:

    RedfieId schrieb:

    Nun möchte ich gerne das die Namen die in Box1 und Box2 gleich sind aus den Boxen entfernt wird, so das nur noch die Namen in den Boxen sind die in den anderen nicht sind

    Deine tatsächlich gewünschte Aufgabe geht natürlich viel einfacher:
    Mit LINQ:

    VB.NET-Quellcode

    1. Dim VerbleibendeEinträge = Liste2.Except(Liste1).ToList

    Oder mit Deiner nicht-empfehlenswerten-ändern-wir-die-Daten-innherhalb-der-ListBox-Methode:

    VB.NET-Quellcode

    1. For Each zeile As String In Listbox1.Items
    2. ListBox2.Items.Remove(zeile)
    3. Next


    btw: Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden. Stichwort Option Strict On: ListBox2.Items.RemoveAt(zeile). RemoveAt will einen Zeilen-/Eintragsindex, keinen String.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ListBox2.Items.Remove(zeile)
    Funktioniert nicht da die Zeile nicht markiert ist

    Linq braucht sicher Listen gell?
    wenn ich bei
    Liste1.AddRange(Pfad)

    mache bekomm ich ein Fehler angezeigt

    Edit:
    also das was jetzt aktuell passiert ist wenn ich die Form starte

    1. Form und Items werden erstellt
    2. alle listboxen werden gefüllt

    als 3. möcht ich nun das die Boxen die schon gefüllt sind abgeglichen werden sollen

    deswegen hab ich das mit dem RemoveAt versuchte

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RedfieId“ ()

    Funktioniert bei mir super.

    RedfieId schrieb:

    Funktioniert nicht da die Zeile nicht markiert ist
    Was soll das bedeuten?

    Ja, LINQ ist eine Listengeschichte.
    Liste1.AddRange(Pfad) :S AddRange will ein Datenarray haben. Pfad ist sicherlich nur ein String. Was Du dem Computer mit jener Codezeile mitteilst: Füge folgende zig Einträge der ListBox hinzu: C:\MeineDateien.
    Einen String, in dem ein Verzeichnispfad ist. Dann steht in der ListBox drin - wenn es funktionieren würde: Ein Eintrag mit der Beschriftung C:\MeineDateien
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nein in der listbox sind alle Einträge die im Verzeichnis sind drin das passiert als 2.

    VB.NET-Quellcode

    1. Try
    2. Dim dirs As String() = Directory.GetFiles(Path)
    3. Console.WriteLine("The number of files starting with c is {0}.", dirs.Length)
    4. Dim dir As String
    5. For Each dir In dirs
    6. Listbox.Items.Add(IO.Path.GetFileNameWithoutExtension(dir))
    7. Next
    8. Catch e As Exception
    9. Console.WriteLine("The process failed: {0}", e.ToString())
    10. End Try​

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RedfieId“ ()

    Nochmal, bevor die Moderation sauer wird: Nutze CodeTags. Den Link dazu hab ich Dir bereits in Post#8 gegeben. Hier nochmal: CodeTags verwenden <- draufklicken und Inhalt anwenden!
    Damit klar wird, wo der Denkfehler liegt: Was steht als Beispiel in ListBox1 drin, was in ListBox2?
    ListBox2.Remove(zeile) funktioniert nur, wenn zeile z.B. ein String ist und genauso in ListBox2 drinsteht. Andere Groß-/Kleinschreibung, Leerzeichen oder komplett anderer Inhalt führt dazu, dass der Eintrag nicht entfernt wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    CodeTags erfolgreich angewendet :thumbup:

    Option Strict ON! Cover_Box.Items(zeile) = True ergibt einen Boolean-Wert, also True oder False. Und dann wird bei zeile = … geschaut, ob zeile dieser Boolean-Wert ist. Kann es aber nicht, weil zeile ein String ist. Daher trifft diese Bedingung niemals zu!
    Lass einfach Zeile#2 und #4 weg und gut ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VB.NET-Quellcode

    1. ​Public Sub Abgleich()
    2. For Each zeile As String In Filme_Box.Items
    3. Cover_Box.Items.Remove(zeile)
    4. Next
    5. End Sub


    so schaut die sub nun aus
    diese lass ich mit einem Button aufrufen
    jedoch sind die Einträge immer noch in der Liste ich verstehe nicht warum
    denn Remove sollte sie raus hauen
    Nochmal gefragt:

    VaporiZed schrieb:

    Was steht als Beispiel in ListBox1 drin, was in ListBox2?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. For Each zeile As String In Filme_Box.Items
    3. Cover_Box.Items.Remove(zeile)
    4. Next
    5. End Sub

    Mit Deinem Code kommt genau das raus.
    Bilder
    • vorher - nachher.png

      3,33 kB, 550×140, 115 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.