Arrays miteinander vergleichen und "unterschied" ausgeben

  • VB.NET

Es gibt 59 Antworten in diesem Thema. Der letzte Beitrag () ist von ThePlexian.

    Arrays miteinander vergleichen und "unterschied" ausgeben

    Guten Abend,

    ich möchte zwei Arrays miteinander vergleichen, und den "Unterschied" in einem 3. Array ausgegeben haben.

    VB.NET-Quellcode

    1. Dim array1() As String = {"1", "2", "3"}
    2. Dim array2() As String = {"1", "2", "3","4","5"}
    3. Dim array3() As String = {"4","5"} 'Hier der Unterschied der 2 Arrays


    Wie bekomme ich das am besten hin?

    Habe es schon mit zwei For Each Schleifen ineinander probiert, allerdings klappt das nicht :(

    Mit freundlichen Grüßen

    Niklas
    Moin,

    schau Dir mal Except-Extension in System.Linq an, die gibt ein IEnumerable<T> (T ist Bei Dir String) zurück, dass diese Elemente enthält. Dieses kannst Du ja dann mit ToArray in ein Array verwandeln.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Was verstehst du unter Unterschied.
    Man kann theoretisch sagen, dass sie sich in ihrer "Größe" bzw. Länge unterscheiden. Du willst wahrscheinlich sie miteinander vergleichen und ausgeben welche Elemente bei den/dem jeweiligen Array fehlt.
    Und dann wie detailliert soll verglichen werden. Case-sensitive?

    MfG Tim
    So habe jetzt mal folgendes probiert:

    VB.NET-Quellcode

    1. Dim string1 As String
    2. Dim string2 As String
    3. string1 = My.Computer.FileSystem.ReadAllText(liste1.txt")
    4. string2 = My.Computer.FileSystem.ReadAllText("liste2.txt")
    5. Dim array As String = string2.Except(string1).ToArray()
    6. ListBox1.Items.Add(array)


    liste1.txt sieht so aus:

    Quellcode

    1. Datei 1
    2. Datei 2
    3. Datei 3
    4. Datei 4
    5. Datei 5


    liste2.txt sieht so aus:

    Quellcode

    1. Datei 1
    2. Datei 2
    3. Datei 3
    4. Datei 4
    5. Datei 5
    6. Datei 6
    7. Datei 7
    8. Datei 8
    9. Datei 9


    Jetzt bekomme ich als Ausgabe 6789, welches die Zeilenangabe ist. Allerdings möchte ich als Ausgabe ("Datei 6", "Datei7","Datei8","Datei9") haben.

    MFG
    Du vergleichst ja auch Strings (ergo Char-Arrays zur Vorstellung) und keine Listen.
    Ersetze ​My.Computer.FileSystem.ReadAllText durch ​System.IO.File.ReadAllLines
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    VB.NET-Quellcode

    1. Option Strict On

    Please.
    Ein String ist kein Array. Bring die Typen nicht durcheinander, das kann böse enden. Mich wunderts warum das überhaupt funktioniert.

    VB.NET-Quellcode

    1. With My.Computer.FileSystem
    2. Dim list1 = .ReadAllText("liste1.txt")
    3. Dim list2 = .ReadAllText("liste2.txt")
    4. ListBox1.Items.AddRange(list2.Except(list1).ToArray())
    5. End With


    So im etwa.

    MfG Tim

    Fortender schrieb:

    Ein String ist kein Array.

    Da wäre ich vorsichtig. Iwo ist ein String schließlich ein Char-Array - nicht zu 100%, aber im Ansatz.

    Und was ist an deinem Vorschlag jz anders ?

    EDIT: Okay, wenn sich deine Äußerung auf das ​Dim array As String = string2.Except(string1).ToArray() bezog, dann nheme ich alles zurück.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    @ThePlexian
    Ja ich wollte jetzt nicht so weit reingreifen :P
    Klar ist eine Zeichenkette im Prinzip ein char-array. Aber selbst dann würde man scheitern, da man einen zweidimensionalen char-array in einen eindimensionalen char-array casten wolle.

    MfG Tim
    ein String ist IEnumerable(Of Char), und deshalb funktioniert der Code, sogar mit Strict On.

    Selbst die Zuweisung ist i.O.:

    VB.NET-Quellcode

    1. Dim array As String = string2.Except(string1).ToArray()
    Denn es gibt einen Widening CType-Operator zum Umwandeln eines Char() -> String
    Und die Ausgabe ist völlig korrekt: Alle Chars, die in string2 vorkommen, in string1 aber nicht.

    Nur wegen solcher Benamung muss ich immer weinen:

    VB.NET-Quellcode

    1. Dim array As String ...
    Welchen Datentyp hat array?
    Wurde ja schon gesagt, dass ein Array kein String ist, aber dieses array ist nun leider doch ein String, und das ist gewissermassen der Verwirrungs-GAU.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Das eine Zeichenkette im Prinzip ein char-array ist is klar. aber analog dazu wäre doch dann ein string-array also string() ein Feld aus char arrays.
    Chat()() oder nicht?

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

    also was ich sagte ist so, ist also nicht "im Prinzip" gemeint.
    Ein Char() hat eine direkte Umwandlung (widening CType) nach String, nicht umgekehrt.

    wenn du im Prinzip eine Zeichenkette als Char() auffassen willst, ja, dann kannst du ebenso im Prinzip auch eine String() als Char()() auffassen, ja. Im Prinzip aber nur. ;)
    Mein Gott stand ich grad aufm Schlauch. Das mit char() usw is mir bekannt und logisch. Ich dachte, dass bei

    VB.NET-Quellcode

    1. ​Dim array As String = string2.Except(string1).ToArray()
    der Fehler darin besteht, dass Except
    einen String-Array returnt. Und man kann eben kein String-Array so ohne Weiteres in einen einfachen String
    "reinpressen". Meine Güte :P Except gibt nen char array zurück.
    Nichts für ungut :D

    MfG Tim
    Die Methode gibt immer ein IEnumerable<TSource> zurück, kein Array. Dein Code funktioniert, weil ​String ​IEnumerable<char> implementiert und somit dort angegeben werden kann, die TSource ist dann ​char.

    Und der Name ​array passt da nicht so wirklich. ;)

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hab jetzt mal ein bisschen mit der Lösung von @Eierlein herumgespielt...

    Habe jetzt herausgefunden, dass das System funktioniert, wenn es in den zwei Textdateien nur einen Unterschied gibt. Sobald es allerdings mehrere werden, funktioniert es nicht mehr :(

    Ausgangssituation: Ich habe 2 gefüllte Listboxen nebeneinander. Sobald in der linken sich ein Eintrag ändert, soll er es mit der rechten Vergleichen. Wenn der linke Eintrag anders (z.B statt 1.0, 1.1) als der rechte ist, soll er den Namen des Items in eine 3. Listbox eintragen...

    Also nochmal zur Verdeutlichung. In der linken Listbox befindet sich ein Eintrag mit dem Namen 1.1. In der rechten ein Eintrag mit dem Namen 1.0. Jetzt soll er erkennen, dass die 1.1 neuer ist, und in der 3. Listbox soll 1.1 stehen :)

    Ich hoffe das ist möglich und ich habe euch nicht zu arg verwirrt :D

    MFG
    Das geht auch einfacher und eleganter mit Except. Wenn Du nicht weißt, wie Du LINQ benutzt, dann frag' halt oder mache Dich im Internet schlau. Ist aber doch blöd die Lösung einfach liegen zu lassen und sich rumzuschlagen, bis man eine findet, die weniger schön ist, oder?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: