VB NET Dictionary – ein kompletter Guide in 2022

VB NET Dictionary Guide
VB NET Dictionary Guide

Was ist ein VB NET Dictionary?

Ein VB NET Dictionary ist – einfach gesagt – eine Sammlung von Schlüsseln mit entsprechenden Werten, auch „Schlüssel-Wert-Paare“ genannt. Das gängigste Beispiel für ein Dictionary ist wohl etwas, was jeder von uns einmal im Leben benutzt hat – besonders „damals“. Ich spreche über ein simples Telefonbuch, was ja eigentlich auch nur die jeweilige Telefonnummer zu einem passenden Namen speichert.

Bevor wir weiter über das VB NET Dictionary im Detail sprechen, müssten wir erst einmal einen Schritt zurück machen. Dieser Kontrast wird Dir dabei helfen, das Dictionary und dessen Funktionsweise besser zu verstehen. Lass‘ uns also mit einem Standard-Ding namens „List“ starten, Welche natürlich – wie der Name schon sagt – für das Auflisten von Einträgen ist.

💡 Keine Zeit? Kein Problem, nutze gerne das Inhaltsverzeichnis, um direkt zu den für Dich wichtigen Punkten zu kommen.

Vergleich einer Liste zu einem Dictionary

Wie ich oben bereits erwähnt habe, sollten wir zuerst einmal die grobe Funktionalität eines Dictionaries zu einer generischen Liste vergleichen. Das hilft uns dabei, das Wörterbuch (Dictionary) aus dem NET-Framework besser zu verstehen. Lass‘ uns also nun eine Liste erstellen und ein paar Einträge hinzufügen, wir werden hierfür auch eine kleine Klasse hinzufügen. Diese Klasse dient nur zu Testzwecken und bleibt somit eher einfach.

Erstelle nun eine neue Datei für die Klasse Namens „Customer.vb“ und speichere Sie.

Public Class Customer

  Public Property Id As Integer

  Public Property Name As String

  Sub New(id As Integer, name As String)
    Me.Id = id
    Me.Name = name
  End Sub

End Class

Nachdem wir die Klasse erstellt haben, können wir nun eine Listen-Eigenschaft innerhalb der Form deklarieren. Als nächstes instanziieren wir die deklarierte Eigenschaft im Form-Konstruktor. Im letzten Schritt werden wir dann ein paar Kunden-Instanzen zu dieser Liste hinzufügen.

Public Class Form1

  Public Property Customers As List(Of Customer)

  Sub New()
    InitializeComponent()
    Customers = New List(Of Customer)
  End Sub

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Customers.Add(New Customer(1, "Some Ltd."))
    Customers.Add(New Customer(2, "Nice Profit Ltd."))
    Customers.Add(New Customer(3, "Perfect Devs Ltd."))
  End Sub

End Class

Einen spezifischen Kunden finden

Eine erste von uns gewünschte Sache könnte es nun sein, einen spezifischen Kunden innerhalb dieser Liste zu finden. Grundsätzlich ist das nicht weiter schwierig, wenn man es einfach runterprogrammiert. Hier gibt es 2 gängige Ansätze, einerseits das eher Oldschool-Prinzip mithilfe einer „For Each“-Schleife und andererseits die modernere LINQ-Variante.

' anderer Code
' ...

' vielleicht die Id des Ziel-Kunden aus einer Textbox ziehen?
Dim idToFind = 2
Dim foundCustomer As Customer
For Each customer In Customers
  If customer.Id = idToFind Then
    foundCustomer = customer
    Exit For
  End If
Next
' irgendwas mit dem Kunden machen, zumindest wenn gefunden..

Hier wäre der modernere LINQ-Ansatz (was engl. mehr oder weniger für sprachintegrierte Abfragen steht), Welcher praktisch nur eine Zeile ist.

' anderer Code
' ...

Dim idToFind = 2
Dim foundCustomer = Customers.SingleOrDefault(Function(x) x.Id = idToFind)
' irgendwas mit dem Kunden machen, zumindest wenn gefunden..

Wo ist der Haken?

Wie Du Dir anhand des Codes vielleicht schon denken konntest, muss so jedes Element durchgegangen und die Id des jeweiligen Kunden mit der übergebenen Id verglichen werden. Stell Dir nun vor, es wäre eine Liste von ca. 300000 Einträgen. Schaue Dir hierzu gerne einmal die unten vorbereiteten Testergebnisse an (wenig Einträge versus 300000 Einträge).

Der erste Test wird hierzu einfach 3 Einträge zur Liste hinzufügen und dann suchen wir z. B. nach dem Kunden mit der Id 2. Hört sich erstmal relativ einfach, bzw. nicht so spannend an, aber Moment..

Nach einem Kunden in einer kleinen Liste suchen - VB NET Dictionary Beispiel
Nach einem Kunden in einer kleinen Liste suchen – VB NET Dictionary Beispiel

Als Nächstes schauen wir uns den zweiten Test an, wo wir wesentlich mehr Testdaten verwenden werden. In diesem Beispiel nutze ich die tatsächlich angesprochenen 300000 Einträge und schaue nach Kunden-Id 280000.

Nach einer hohen Kunden-Id innerhalb einer Liste suchen - VB NET Dictionary Beispiel
Nach einer hohen Kunden-Id innerhalb einer Liste suchen – VB NET Dictionary Beispiel

Kannst Du die dramatische Performance-Änderung sehen? Im nächsten Abschnitt werden wir diese gleiche Aufgabe mit einem Dictionary lösen. Natürlich sind die obigen Zeiten für uns als Menschen eher wie ein Du weißt schon im Wind, aber.. Stell Dir diese Performance-Verluste in z. B. einer Server-App vor, man möchte natürlich, dass der Server so performant wie nur möglich läuft.

Für unseren nächsten Testvorgang werden wir nun schauen, warum wir dann lieber ein Dictionary verwenden sollten. PS: Du kannst dieses Testprojekt auch weiter unten in der Downloads-Sektion finden.

Wann sollte man ein VB NET Dictionary verwenden?

Nach dem riesigen, oben gesehenen Performance-Unterschied, werden wir uns nun das Dictionary im Einsatz ansehen. Wenn es um „Lookup“-Zeiten geht, strahlt das Dictionary – ich meine dazu ist ein Wörterbuch ja auch irgendwie da, richtig? Wie ich bereits oben erwähnte, ist das Wörterbuch in VB NET (Dictionary) einfach nur eine Auflistung von „Schlüssel-zu-Wert-Paaren“.

Du kannst einen existierenden Schlüssel verwenden, um den sich dahinter befindlichen Wert herauszufinden. Natürlich kannst Du auch überprüfen, ob das Dictionary einen bestimmten Schlüssel überhaupt beinhaltet. Schauen wir es uns nun in Aktion an, wenn es also um 300000 Einträge und dem Ziel-Kunden mit der Id 280000 geht.

Schnelle "Lookup"-Zeiten mithilfe eines VB NET Dictionary
Schnelle „Lookup“-Zeiten mithilfe eines VB NET Dictionary

Das ist wirklich herausragend, oder? Das Dictionary hat das Heraussuchen des Kunden mit der Id 280000 in einem kleinen Augenzwinkern erledigt.

Wie man dem VB NET Dictionary Einträge hinzufügt

Nachdem wir die Performance für unsere gestellte Aufgabe nun zwischen einer Liste und einem Dictionary verglichen haben, gehen wir ein Schritt weiter. Wir sehen uns nun an, wie man dem Wörterbuch einige Einträge hinzufügen kann. Für dieses Beispiel werde ich auf ein einfaches Telefonbuch wechseln.

Zuerst instanziieren wir eine neue Instanz der Dictionary-Klasse. Dafür brauchen wir zwei generische Typenargument. Der Erste sagt aus: „Hey, ich möchte Schlüssel-Wert-Paare mit einem Schlüssel vom Typ x speichern“. Der zweite Parameter sagt praktisch: „.. und ich möchte diese Schlüssel benutzen, um an passende Werte vom Typ y zu kommen“.

Einträge / Werte hinzufügen

In unserem Beispiel werden wir einen Namen für die Suche nach einer Telefonnummer verwenden. Letztendlich haben wir dann also einen String-Schlüssel, womit wir nach einem String-Wert suchen können.

Dim telefonbuch = new Dictionary(Of String, String)
' füge nun einige string zu string Zuordnungen hinzu (also Namen zu Telefonnummern)
' (Die Nummern habe ich natürlich zufällig getippt - bitte nicht anrufen ;))
telefonbuch.Add("Max Mustermann", "+491122334567")
telefonbuch.Add("Christine Doe", "+49188655542")
telefonbuch.Add("Michael Mustermann", "+4948862342")

Was passiert bei doppelten Schlüsseln?

Nachdem man nun einige Werte hinzugefügt hat fragt man sich ggf.: „Okay und was passiert, wenn ich doppelte Schlüssel hinzufügen?“. Das schauen wir uns nun im nächsten Schritt an. Ich habe dafür z. B. einfach einen Schlüssel namens „key“ und einen Wert namens „value“ zwei mal hintereinander hinzugefügt. Hier siehst Du, was dann passiert:

ArgumentException beim Hinzufügen doppelter Schlüssel in einem VB NET Dictionary
ArgumentException beim Hinzufügen doppelter Schlüssel in einem VB NET Dictionary

Man bekommt eine „ArgumentException„, Welches sich im „System“-Namespace befindet. Die bedeutet praktisch: „Hey, Du kannst keinen weiteren Eintrag mit dem gleichen Schlüssel namens ‚key‘ hinzufügen“.

Wie verhindert man doppelte Schlüssel in einem VB NET Dictionary?

Man kann eigentlich relativ einfach verhindern, dass man den oben genannten Fehler bekommt. Wir brauchen dafür einfach nur eine andere Methode der Dictionary-Klasse. Ich spreche von der Methode namens „TryAdd„. Diese wird einfach versuchen, das jeweilige Schlüssel-Wert-Paar hinzuzufügen und gibt uns dann Bescheid, ob es geklappt hat. Dazu bekommen wir einen booleschen Wert a la „True“, oder „False“ zurück.

Dim erfolgreichHinzugefügt As Boolean
erfolgreichHinzugefügt = telefonbuch.TryAdd("Max Mustermann", "+491122334567")
' erfolgreichHinzugefügt wäre hier TRUE (beim ersten Mal!)
erfolgreichHinzugefügt = telefonbuch.TryAdd("Max Mustermann", "+491122334567")
' erfolgreichHinzugefügt wäre hier FALSE (beim zweiten Mal!)

Alternativ könntest Du auch vorher die „ContainsKey„-Funktion verwenden, um das Dictionary auf einen gewissen Schlüssel zu überprüfen.

If telefonbuch.ContainsKey("Max Mustermann") Then
  ' ohoh, das Wörterbuch beinhaltet bereits einen Schlüssel namens "Max Mustermann"
Else
  ' noch nicht in Verwendung, weiter..
End If

Fazit

Fazit
Fazit

Am Ende vom heutigen Post fassen wir zusammen, was wir heute bezüglich der VB NET Dictionary gesehen haben. Grundsätzlich ist das Dictionary einfach eine Sammlung von Schlüssel-Wert-Paaren. Anhand gewisser Schlüssel, kann man in hoher Geschwindigkeit auf die zugeordneten Werte zugreifen. Denke daran, dass das Dictionary keine Garantie für die Reihenfolge der einzelnen Einträge gibt, schaue hierzu gerne in die Dokumentation.

Downloads

Weiterführende Links

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.