8.2 Collections im Namespace »System.Collections«
In Tabelle 8.1 erhalten Sie einen Überblick über die wichtigsten Auflistungsklassen im Namespace System.Collections.
Klasse | Beschreibung |
ArrayList |
Bei dieser Liste handelt es sich wohl um die universellste. Sie nimmt beliebige Objekte auf und gestattet den wahlfreien Zugriff auf die Listenelemente. |
Verwaltet ein Array von Bits. |
|
Eine Auflistung, bei der keine Unterscheidung zwischen Groß- und Kleinschreibung erfolgt. |
|
Hashtable |
Die Elemente werden als Schlüssel-Wert-Paare gespeichert. Der Zugriff auf die Elemente erfolgt über den jeweiligen Schlüssel. |
Das Verhalten orientiert sich an der Anzahl der Listenelemente. Ist die Anzahl der Elemente gering, operiert diese Klasse als ListDictionary-Collection, wird die Anzahl größer, als Hashtable. |
|
Solange die Anzahl der Elemente kleiner als zehn ist, werden die Operationen mit den Elementen schneller ausgeführt als bei einer Hashtable. |
|
Verwaltet ein Schlüssel-Wert-Paar, wobei sowohl der Schlüssel als auch der Wert durch Zeichenfolgen beschrieben werden. Einem Schlüssel können mehrere Zeichenfolgen zugeordnet werden, d. h., der Schlüssel ist nicht eindeutig. |
|
Diese Auflistung verwaltet Schlüssel-Wert-Paare, die nach den Schlüsseln sortiert sind und auf die sowohl über Schlüssel als auch über Indizes zugegriffen werden kann. Damit vereint sie die Merkmale von Hashtable und ArrayList. |
|
Eine Auflistung, die nur Zeichenfolgen enthält. |
|
Ähnlich einer Hashtable; der Schlüssel ist jedoch immer eine Zeichenfolge. |
Diese Klassen unterscheiden sich in den Methoden, mit denen der Zugriff auf die Elemente erfolgt, und in der Speicherverwaltung der Elemente. Jede Listenklasse hat ihre eigene Charakteristik, auch hinsichtlich der Operationen, die auf den Elementen ausgeführt werden können.
Als zwei typische Vertreter der Auflistungsklassen im .NET Framework werden wir uns in diesem Kapitel exemplarisch auf die Charakteristik der beiden Klassen ArrayList und Hashtable konzentrieren und deren wesentlichste Merkmale herausarbeiten. Zunächst einmal möchte ich die beiden Klassen allgemein beschreiben.
Die Klasse »ArrayList«
ArrayList ähnelt einem klassischen Array. Im Gegensatz zu einem herkömmlichen und damit statischen Array ist ein ArrayList-Objekt dynamisch. Sie können so lange Objekte zur Liste hinzufügen, bis dem Speicher regelrecht die Puste ausgeht. Der Zugriff auf ein Element einer ArrayList erfolgt über die Angabe des entsprechenden Listenindex.
Die Klasse »Hashtable«
Die Klasse Hashtable beschreibt eine Liste von Elementen, die im Gegensatz zur ArrayList nicht durch Indizes verwaltet werden, sondern durch ein Schlüssel-Wert-Paar. Der Vorteil eines Hashtable-Objekts ist, dass innerhalb der Liste sehr schnell nach bestimmten Objekten gesucht werden kann. Der Name der Klasse hat seine Ursache darin, dass für die Verwaltung der Elemente ein Hashcode für den Schlüssel verwendet wird. Ein Hashcode ist ein Wert, der aus den Daten eines Objekts gebildet wird und somit für gleiche Objekte gleich ist. Der Zugriff auf ein Element in dieser Liste erfolgt über den Schlüsselwert, der grundsätzlich ein beliebiges Objekt sein kann. In der Praxis wird dazu meist eine Zeichenfolge benutzt.
8.2.1 Die elementaren Schnittstellen der Auflistungsklassen

Die Grundfunktionalität aller Auflistungen lässt sich auf elementare Methoden zurückführen. Es ist deshalb nicht verwunderlich, dass die Gemeinsamkeiten durch Interfaces beschrieben werden, die von den Auflistungsklassen implementiert werden. Im Wesentlichen handelt es sich dabei um die Schnittstellen
Die beiden zuerst aufgeführten Schnittstellen IEnumerable und ICollection werden von allen Standardauflistungsklassen implementiert und stellen Verhaltensweisen sicher, über die jede Auflistungsklasse verfügt.
Das elementare Verhalten einer Auflistungsklasse (also entweder die Indexverwaltung oder die Verwaltung mit einem Schlüssel-Wert-Paar) wird durch die Implementierung des Interfaces IList oder des Interfaces IDictionary beschrieben. IList ist elementar für indexbasierte Auflistungen, IDictionary ist die Schnittstelle der Listen, die durch Schlüssel-Wert-Paare beschrieben werden.
Ohne zu sehr in die Details zu gehen, wollen wir uns nun ein wenig genauer die vier genannten Schnittstellen ansehen.
Die Schnittstelle »IEnumerable«
Die Schnittstelle IEnumerable wird von allen Auflistungen implementiert. Sie ermöglicht, dass eine Liste in einer foreach-Schleife durchlaufen werden kann, und weist nur die Methode GetEnumerator auf, die ein Objekt zurückliefert, das die Schnittstelle IEnumerator implementiert. Dieser Enumerator verfügt über die Fähigkeit, eine Auflistung elementweise zu durchlaufen. Damit gleicht dieses Objekt einem Positionszeiger, dem drei Methoden Current, MoveNext und Reset zu eigen sind.
Der Enumerator positioniert sich standardmäßig vor dem ersten Eintrag einer Auflistung. Um ihn auf den ersten Eintrag und anschließend auf alle Folgeeinträge zeigen zu lassen, muss die Methode MoveNext ausgeführt werden. Mit Current wird auf den Eintrag zugegriffen, auf den der Enumerator aktuell zeigt. Reset setzt den Enumerator an seine Ausgangsposition zurück, also vor den ersten Eintrag.
In Abschnitt 8.6 werden wir noch einmal auf das Interface IEnumerable eingehen, wenn es darum geht, eigene Klassen zu entwickeln, die in einer foreach-Schleife durchlaufen werden können.
Die Schnittstelle »ICollection«
Die Schnittstelle ICollection stellt allen Auflistungen die Eigenschaften Count, IsSynchronized und SyncRoot zur Verfügung, und darüber hinaus auch die Methode CopyTo. Die Eigenschaft Count liefert die Anzahl der Elemente einer Auflistung zurück, die Methode CopyTo kopiert die Elemente in ein Array.
Auflistungen sind kritisch beim gleichzeitigen Zugriff mehrerer Threads. Um diesem Umstand Rechnung zu tragen, wird die Methode Synchronized bereitgestellt. Die Eigenschaft IsSynchronized gibt an, ob die Auflistung synchronisiert wird.
Wegen der gemachten Aussagen ist es nicht verwunderlich, dass praktisch alle Standardauflistungen das Interface ICollection implementieren.
Die Schnittstelle »IList«
Auflistungen, die IList implementieren, verwalten ihre Elemente über Indizes. Das beste Beispiel hierfür dürfte die Klasse ArrayList sein.
Die wichtigsten Methoden, die von IList zur Verfügung gestellt werden, sind Add, Clear, Contains, Insert, IndexOf und Remove. Sie werden Listen, die diese Methoden aufweisen, überall im .NET Framework begegnen: sei es innerhalb der WinForm-API oder bei verschiedenen Klassen von ADO.NET.
Auch die Klasse Array, auf der alle herkömmlichen Arrays basieren, implementiert das Interface IList.
Die Schnittstelle »IDictionary«
IDictionary ist der Gegenspieler von IList. Während IList-implementierende Auflistungen den Zugriff auf die Elemente über einen Index sicherstellen, erfolgt er bei IDictionary-Auflistungen über einen Schlüssel. An dieser Stelle mehr über dieses Interface zu berichten würde zu tief ins Detail führen. Aber wir werden im Zusammenhang mit der Klasse Hashtable noch darauf zu sprechen kommen.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.