2 List(of Strings) vergleichen; 180werte mit 586Werte ; werte ändern sich.

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Akki.

    2 List(of Strings) vergleichen; 180werte mit 586Werte ; werte ändern sich.

    Hallo VB Freunde,

    Ich muss 180 Werte aus einer Liste180 mit einer anderen Liste586, die 586 Werte hat, VERGLEICHEN. Da die Werte dynamisch sind können auch andere Werte vorkommen und sind daher nicht immer gleich.


    Sobald die Werte übereinstimmen, schreibe ich mir Ein "TRUE" in meine List(of Boolean hinein). Ein False in der Liste wird erst reingeschrieben, wenn die Liste einmal komplett durch ist.
    Wenn eine Überstimmung erfolgreich war, springt er in der Liste586 zu einem anderen Startwert. Dies mache ich deshalb, damit er nicht unnötig weiter vergleicht.
    Da ich die Startwerte immer vorher berechne, vermeide ich somit überflüssigen Vergleich.


    Hier Mein Code:


    VB.NET-Quellcode

    1. Dim Liste180Werte As New List(of String)' Hier sind in diesem Bsp. 180 Strings
    2. Dim Liste586Werte As New List(of String)'Hier sind in diesem Bsp. 586 Strings
    3. Dim BedingungsCheckListe As New List(of Boolean)'Liste um bei gefundenen Eintrag True oder False wenn nicht gefunden zu setzen
    4. Dim StartWerte As New List(of Integer)'Die Liste enthält in diesem Bsp. 5 StartWerte: 0, 112, 242, 359, 480
    5. Dim zaehler As Integer = 0
    6. Dim laeufer As Integer = 0
    7. Dim k As Integer = 0
    8. Dim l As Integer = 0
    9. Dim WertVergleich As Integer = 0
    10. Dim NrInListe As Integer = 0
    11. Dim iFinde As Integer = 0
    12. Dim letzteZeile As Integer = 5' hat in diesem Bsp. 5 muss aber nicht, ändert sich
    13. Dim Code180Str As String = ""
    14. Dim Code586Str As String = ""
    15. For iFinde = 0 To Liste180Werte.Count - 1'Gehe die Liste180Werte durch
    16. Code180Str = Liste180Werte(iFinde)'Überschreibe bei jedem Durchlauf diesen String, dient zum späteren Vergleich
    17. Do
    18. For NrInListe = 0 To Liste580Werte.Count - 1'Gehe die Liste580Werte durch
    19. Code586Str = Liste586Werte(NrInListe)'Überschreibe bei jedem Durchlauf diesen String ebenso, dient zum späteren Vergleich
    20. 'Debug.WriteLine(" Code180Str = Code586Str!" & Code180Str.Substring(0, 3) & Komma & Code586Str.Substring(5, 3))'AUsgabe zum Test
    21. If Code180Str.Substring(0, 3) = Code586Str.Substring(5, 3) Then'Vergleiche beide String, ob gleich ist?
    22. BedingungsCheckListe.Insert(zaehler, True)'er hat was gleiches gefunden; Schreibe ein TRUE in BedingungsCheckListe
    23. zaehler += 1' Erhöhe den zaehler dieser Liste
    24. 'Diese If Abfrage dient dazu, damit die Liste ihr ende erreict und dann nicht mehr erhöht wird
    25. If laeufer <= letzteZeile-1 Then' Die Variable laeufer, ist die Variable für die Liste und die Variable letzteZeile hat in diesem Bsp. den Wert 5
    26. 'Hier taucht auch der Fehler auf: Der Index liegt außerhalb des Bereichs...
    27. WertVergleich = StartWerte(laeufer)' Die werte werden somit, sobald True gesetzt geschrieben wurde, der neue Startwert der Varaiablen übergeben
    28. NrInListe = WertVergleich' Diese Variable wird Jetzt der Variablen NrInListe zugewiesen, um oben der For Schleife den neuen Zaehlwert zu übergeben
    29. laeufer += 1'Erhöhe den Listenzaehler um 1
    30. End If
    31. k += 1' Diese Variable dient dazu, dass ich immer mit zaehle wie viel mal er hier True gesetzt hat damit ich dann weiß wie viel mal ich false setzen muss
    32. 'Debug.WriteLine("True")
    33. ElseIf k = 0 Then ' Wenn der erste durchlauf mit WERT "XYZ" kein Erfolg hatte, wurde somit auch k nicht hochgezaehlt, dann mache ich hier weiter
    34. For l = zaehler To letzteZeile'der Wert der Variable Zaehler wird hier l zugewiesen, damit die Reihenfolge in der BedingungsChekListe bestehen bleibt.
    35. BedingungsCheckListe.Insert(zaehler, False)'es wird jetzt 5 mal False hineingeschrieben
    36. zaehler += 1' Erhöhe den zaehler dieser Liste
    37. 'Debug.WriteLine("False")
    38. Next
    39. ElseIf k <> 0 Then'Falls der k Wert ungleich ist dann..
    40. For l = zaehler To letzteZeile - k'
    41. BedingungsCheckListe.Insert(zaehler, False)' Schreibt er mir nur soviele False hinein wie viel aus der Rechnung: letzteZeile - k resultieren
    42. zaehler += 1'Erhöhe den zaehler dieser Liste
    43. 'Debug.WriteLine("False")
    44. Next
    45. End If
    46. Next NrInListe' Hier wird die Variable NrInListe immer erhöht
    47. Loop Until NrInListe <> StrTotal'Diesen Block macht er solange bis er die Totallänge erreicht die in diesem Fall 586 ist
    48. NrInListe = 0'dann wird die Variable NrInListe wieder auf 0 gesetzt
    49. laeufer = 0' diese Variable für die Startwert wird ebenfalls auf 0 gesetzt
    50. Next iFinde' Jetzt wird der nächste Wert aus der Liste180Werte genommen und wieder komplett verglichen mit der anderen Liste, dabei
    51. 'soll wieder gesprungen werden


    Mein Problem ist der Sprung funktioniert nicht entweder ich bekommen eine Fehlermeldung, das der Index außerhalb des Bereichs liegt, betrifft die StartWerte Liste.
    Oder ich habe eine endlossschleife und er vergleicht lediglich nur den ersten Wert andauernd ohne zu realisieren, dass er dann den nächsten Wert nehmen soll
    Ich habe es versucht so ausführlich wie möglich zu kommentieren, damit ihr meinen Code versteht bzw. die Idee die dahinter steckt.
    Selbstverständlich bin ich auch offen für eure Ideen, wie man es vllt am geschickesten lösen könnte. wie schon gesagt sind die Einträge der Liste dynamisch die Werte
    können eine sehr hohe Anzahl annehmen. Dennoch muss ich diesen Vergleich praktizieren, damit ich weiter an meinem Projekt arbeiten kann.

    Was ich immer weiß bzw was ich mir immer vorher ausrechne ist die maximale Länge der Listen und die neuen Startwerte in diesem Beispiel ist es nun 586 und 180. Startwerte siehe oben im QuellCode.


    Vielen Dank für eure Tipps und Hilfe!!! :)

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

    Wie wäre es mit LINQ:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim l1 As New List(Of String) From {"A", "B", "D"}
    4. Dim l2 As New List(Of String) From {"A", "B", "C"}
    5. ' Alles in l1, was NICHT in l2 ist -> D
    6. Dim r_a = l1.Except(l2)
    7. ' Alles in l2, was NICHT in l1 ist -> C
    8. Dim r_b = l2.Except(l1)
    9. ' Alles was in BEIDEN Listen ist -> A,B
    10. Dim r_c = l1.Intersect(l2)
    11. Stop
    12. End Sub
    13. End Class
    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!