Generische Auflistungen unter VB.NET

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Der Unterschied zwischen generischen Auflistungen und nicht-generischen Auflistungen ist, dass Sie für die Elemente einer generischen Auflistung einen konkreten Datentyp vorgeben – das nennt man auch stark typisiert. Bei nicht-generischen Auflistungen nutzen Sie den Objekttyp Object und können somit Werte verschiedener Typen hinzufügen. Dieser Artikel stellt die Grundlagen zu generischen Auflistungsklassen vor und erläutert ihre Funktionsweise.

Hinweis zu den Beispielen

Die Beispiele dieses Artikels haben wir in LINQPad5 erstellt und ausprobiert. Das ist eine schnellere Möglichkeit als ein Visual Studio Projekt zu erstellen, das Sie für jeden Test neu kompilieren und starten müssen. Weitere Infos zu LINQPad5 finden Sie beispielsweise im Artikel LINQPad: LINQ, C# und VB einfach ausprobieren (www.datenbankentwickler.net/100). Wir verwenden hier unter Language den Wert VB Program und rufen unsere Beispielprozeduren jeweils von der Hauptprozedur Sub Main auf.

Generische Auflistungen

Eine generische Auflistung erkennen Sie primär daran, dass Sie diese mit der Angabe des Datentyps für die enthaltenen Werte deklarieren und initialisieren. Dazu verwenden wir das Schlüsselwort Of zusammen mit dem gewünschten Datentyp. Die gängigen generischen Auflistungen werden in den Namespaces System.Collections.Generic und System.Collections.ObjectModel aufgeführt.

Zu den nicht-generischen Auflistungen gibt es in den meisten Fällen ein Pendant unter den generischen Auflistungen. Diese sind leider nicht entsprechend benannt. So ist das generische Gegenstück zu der nicht-generischen Auflistungsklasse HashTable die Dictionary-Klasse und List ist das Pendant zu ArrayList.

Es gibt aber auch generische Auflistungsklassen ohne nicht-generische Entsprechung.

Was sind generische Auflistungsklassen

Generische Auflistungen sind auch Klassen, allerdings solche, die das Speichern einer Reihe anderer Objekte erlauben. .NET bietet einige Auflistungsklassen für verschiedene Anwendungszwecke an. Sie sind aber nicht einfach nur Sammlungen von Daten, sondern bieten auch die Infrastruktur an, um diese Daten an verschiedenen Stellen auf spezielle Art zu nutzen – zum Beispiel als Datenquelle von Steuerelementen unter WPF. Die Auflistungsklassen implementieren verschiedene Interfaces, die Eigenschaften, Methoden und Ereignisse für die unterschiedlichen Zwecke vorsehen. Welche Interfaces eine Collection implementiert, können Sie im Objektkatalog von Visual Studio nachsehen (Strg + Alt + J).

Bild 1 zeigt die Basistypen beziehungsweise Schnittstellen der Auflistungsklasse List(Of T), wobei T dem Datentyp der Elemente der Auflistung entspricht. Im Objektkatalog finden Sie auch die Eigenschaften, Methoden und Ereignisse der jeweiligen Auflistungen.

Die List(Of T)-Auflistungsklasse im Objektkatalog

Bild 1: Die List(Of T)-Auflistungsklasse im Objektkatalog

Die List(Of T)-Auflistungsklasse implementiert beispielsweise die folgenden Interfaces:

  • IEnumerable: Stellt die Eigenschaft GetEnumerator bereit, die allerdings nicht explizit verwendet wird, sondern das Durchlaufen der enthaltenen Elemente in einer For Each-Schleife erlaubt
  • ICollection: Liefert vor allem die Eigenschaft Count.
  • IList: Enthält Methoden, um die Liste zu verwalten – also um Elemente hinzuzufügen, zu entfernen und abzufragen, die Liste zu leeren und weitere Eigenschaften.

Beispiele für generische Auflistungsklassen

In diesem Artikel stellen wir verschiedene generische Auflistungsklassen vor:

  • List(Of T): Entspricht der nicht-generischen Auflistungsklasse ArrayList.
  • Dictionary(Of TKey, TValue): Entspricht der nicht-generischen Auflistungsklasse HashTable.

Die List(Of T)-Auflistungsklasse

Die List(Of T)-Auflistungsklasse ist das generische Pendant zur ArrayList-Auflistungsklasse, das heißt, dass für Ihre Elemente exakt festgelegt wird, welchen Typ diese aufweisen. Das nennt sich auch stark typisiert.

In den folgenden Beispielen wollen wir mit einer kleinen Beispielklasse namens Produkt arbeiten, die wir wie folgt deklarieren:

Public Class Produkt
     Public Produktname As String
     Public Einzelpreis As Decimal
End Class

Ein paar Beispielobjekte auf Basis dieser Klasse erstellen wir mit den folgenden Anweisungen:

Dim Produkt1 As New Produkt With {.Produktname = "Access im Unternehmen", .Einzelpreis = 124}
Dim Produkt2 As New Produkt With {.Produktname = "Access [Basics]", .Einzelpreis = 69}
Dim Produkt3 As New Produkt With {.Produktname = "Datenbankentwickler", .Einzelpreis = 129}

Generische Auflistungsklasse deklarieren und initialisieren

Bei der Deklaration einer generischen Auflistungsklasse geben Sie als Parameter das Schlüsselwort Of und den Typ des enthaltenen Objekttyps an. Für unser Beispiel verwenden wir eine Auflistung namens Produkte mit dem Typ Produkt. Die Deklarationszeile sieht so aus:

Dim Produkte As List(Of Produkt)

Wenn Sie die Initialisierung separat gestalten wollen, gelingt dies so:

Produkte = New List(Of Produkt)

Sie können natürlich auch beides in einer Zeile unterbringen:

Dim Produkte As New List(Of Produkt)

Elemente zu einer generischen Auflistungsklasse hinzufügen

Die oben erstellten Objekte fügen wir mit der Add-Methode zur Auflistungsklasse Produkte hinzu:

With Produkte
     .Add(Produkt1)
     .Add(Produkt2)
     .Add(Produkt3)
End With

Generische Auflistungsklasse schnell füllen per Collection Initializer

Wenn Sie die Liste nicht etwa per Entity Framework aus einer DbSet-Auflistung füllen wollen, können Sie den sogenannten Collection Initializer nutzen. Dabei geben Sie hinter der eigentlichen Initialisierung das From-Schlüsselwort und dann in geschweiften Klammern eine Liste der einzufügenden Elemente an:

Dim Produkt1 As New Produkt With {.Produktname = "Access im Unternehmen", .Einzelpreis = 124}
Dim Produkt2 As New Produkt With {.Produktname = "Access [Basics]", .Einzelpreis = 69}
Dim Produkt3 As New Produkt With {.Produktname = "Datenbankentwickler", .Einzelpreis = 129}
Dim Produkte As New List(Of Produkt) From {Produkt1, Produkt2, Produkt3}
Debug.Print("Anzahl Produkte: " + Produkte.Count.ToString)    

Elemente einer generischen Auflistungsklasse mit For Each durchlaufen

Die einfachste Methode, die Elemente einer generischen Auflistungsklasse zu durchlaufen, ist die For Each-Schleife. Sie verwenden darin eine Variable, welche das jeweilige Element aufnehmen soll und die zu durchlaufende Auflistungsklasse. Die Elemente der soeben angelegten Auflistungsklasse können Sie wie folgt durchlaufen und beispielsweise im Ausgabe-Bereich ausgeben – ausgehend von einer wie oben beschrieben erstellten Auflistung namens Produkte:

 

Schreibe einen Kommentar