VisualBasic .NET zwei Listen (List of) schnell vergleichen

DerZock

Lieutenant
Registriert
Mai 2009
Beiträge
908
Kann mir jemand sagen wie ich in VB.NET Inhalte zweier Listen verlgleichen kann?
Ich habe jetzt eine For each in einer For each Schleife. Das funktioniert so weit auch, allerdings dauert es ewig, da die
adressListe ca. 200.000
und die andere Liste ca. 7.000 Datensätze enthält.

Wie kann ich das ganze beschleunigen?

Hier mal der Code Schnipsel:
Code:
 For Each adresse In adressListe
            For Each dbAdresse In DBConnector.GetDBAdressListe()
                'Wenn Adresse aus CSV mit falscher Adresse aus Datenbank übereinstimmt
                If String.Compare(adresse.Strasse, dbAdresse.StrasseFalsch) = 0 Then
                    'ersetze die Strasse mit der richtigen Strasse aus der DB
                    adresse.Strasse = dbAdresse.StrasseRichtig
                End If
            Next
        Next
 
Der Einsatz von Linq könnte deine Verarbeitung beschleunigen.

Du lädst dir alle Adressen aus der Datenbank in deine Liste und vergleichst dann
alle Adressen aus der CSV-Datei mit dieser DB-Adressliste.
Der Witz dabei ist, dass du via Programmcode ein Select auf die DB-Liste machen kannst. Du musst also nicht immer durch alle Datensätze durch, sondern fragst pro CSV-Eintrag gezielt deine DB-Liste ab.

Wenn du das nicht machen willst, solltest du in deinem IF nach der Übernahme der richtigen Strasse ein Exit For machen, damit er dann auch aufhört weiter durch die Liste zu gehen, obwohl er schon eine Ersetzung vorgenommen hat.
 
LINQ ist ein guter Ansatz. Wenn es aber auch .NET 4 sein darf, dann wäre ein paralleler Ansatz noch besser, z.B. mit PLINQ oder mit einer parallelen ForEach-Schleife.
 
Zuletzt bearbeitet: (typo)
Funktioniert Linq in Verbindung mit einer Oracle Datenbank?
Also würde ich mir die Liste dann via Linq holen und in der where Klausel dann direkt die Strasse abfragen? Habe ich das richtig verstanden?
Ergänzung ()

Also ich habe das ganze jetzt mit einem Dictionary gemacht. Jetzt suche ich gezielt nach dem Strassennamen was um einiges schneller geht.

Code:
For Each adresse In adressListe
            If dic.ContainsKey(adresse.Strasse) Then
                Dim strasseRichtig As String = dic.Item(adresse.Strasse)
                adresse.Strasse = strasseRichtig
            End If
        Next
 
Ja. Das geht vor allem schneller weil du keine 2 verschachtelten Schleifen mehr hast
wo die innere nicht mal angebrochen wird, wenn ein positiver Hit auftrat ;)

Das mit Linq hast du richtig verstanden. Ob es mit Oracle geht weiß ich leider nicht.
Der .NET Treiber von Oracle müsste das EntityFramework unterstützen.
 
Zurück
Oben