Collections Flashcards
Grundlagen (Arrays vs. Collections)
Ein Array ist eine Klasse und ein statischer Container freier und belegter
Elementpositionen
› Collections stellen eine Sammlung an Klassen dar
› Arrays besitzen eine vordefinierte Länge, welche nach der Instanziierung nicht
mehr verändert werden kann
› Objekte auf der Basis von Klassen aus der Sammlung Collections können
hinsichtlich ihrer Größe dynamisch wachsen und schrumpfen
› Für Manipulationen der Werte von Arrays muss Code geschrieben werden,
Collection-Objekte besitzen ihre eigenen Methoden und verwalten sich selbst
› Man unterscheidet einfache, nichtgenerische Collections, die Daten
beliebigen Typs aufnehmen können, und generische Collections, die im
Gegensatz dazu Typsicherheit bieten.
Nicht Generische Klassen finden sich im
Namespace: System.Collections
› Generische Klassen sind im Namespace:
System.Collections.Generics registriert
› Um den Container homogen zu halten, sind
Generische den Nicht-Generischen Collections
vorzuziehen
Die elementaren Schnittstellen
Die Grundfunktionalität aller Auflistungen lässt sich auf elementare Methoden
zurückführen. Deshalb werden die Gemeinsamkeiten durch Interfaces
beschrieben, die von den Auflistungsklassen implementiert werden.
› IEnumerable, ICollection, IDictionary, Ilist
› 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.
ICollection, IList, IDictionary
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, die IList implementieren, verwalten ihre Elemente über Indizes.
Die wichtigsten Methoden, die von IList zur Verfügung gestellt werden, sind
Add, Clear, Contains, Insert, IndexOf und Remove.
› 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.
IEnumarable & IEnumerator
Collections arbeiten intern als Liste und besitzen somit keinen Index
(vgl. Arrays), um von einem Element zu nächsten oder zum
vorhergehendem zu gelangen
› Die Implementierung von IEnumerable schafft erst die Möglichkeit
von einem Element zu nächsten oder zum Vorgänger zu gelangen
› Collections implementieren IEnumerable per default
› Sie ist die Basisschnittstelle für nichtgenerische Auflistungen
› Somit können ForEach-Schleifen, alle Elemente von Collections
ansprechen
IEnumarable & IEnumerator
IEnumerable enthält nur die Methode GetEnumerator(), die ein Objekt
zurückliefert, das die Schnittstelle IEnumerator implementiert
› Ein Enumerator bietet die Möglichkeit, eine Auflistung elementweise zu
durchlaufen, indem dieser die Methoden: Current(), MoveNext() und Reset()
bereitstellt
› Der Enumerator wird vor den ersten Eintrag einer Auflistung positioniert
› Um ihn auf den ersten Eintrag und anschließend auf alle Folgeeinträge zeigen
zu lassen, wird die Methode MoveNext() ausgeführt
› Mit Current() wird auf den Eintrag zugegriffen, auf den der Enumerator zeigt
› Reset() setzt den Enumerator an seine Ausgangsposition zurück
Einfache Collections
Einfache Collections arbeiten intern mit dem Datentyp Object.
› Dadurch können sie Elemente von beliebigen Typen speichern.
› Bei einfachen Datentypen wie z.B. int muss ein Boxing bzw.
Unboxing stattfinden.
› Das macht die Arbeit mit einfachen Collections ggf. langsam.
› Elemente aus der Collection müssen vor Verwendung auf ihren
ursprünglichen Typ gecastet werden.
› Dadurch können Laufzeitfehler entstehen.
Einfache Collections
ArrayList, Hashtable, SortedList, Stack, Queue
ArrayList
Speichert Elemente von beliebigen Typen.
Größe passt sich dynamisch dem Bedarf an.
Elemente werden in der ArrayList als Object gespeichert.
Elemente müssen gecastet werden wenn sie außerhalb der ArrayList
verwendet werden sollen.
Bietet diverse Methoden und Attribute zur Verwaltung der Elemente an:
– Add(), Contains(), Remove(), RemoveAt(), Clear(), …
– Count, Capacity, …
Auszug von ArrayList-Methoden
Add, AddRange, Insert, InsertRange, Remove, RemoveAt, RemoveRange, IndexOf, Sort, Clear, Reverse, ToArray
HashTable
Ein Hashtable speichert Key-Value-Paare von beliebigen Typen.
› Der Key muss dabei eindeutig sein und darf nicht null sein.
› Der Zugriff auf die Elemente erfolgt immer über den Key.
› Der Zugriff auf ein bestimmtes Element ist dadurch deutlich schneller als bei
einer Liste.
› Die Elemente werden in der Reihenfolge der Hashwerte der Keys
gespeichert, ein Zugriff über einen Index ist nicht möglich.
› Hashtables können nicht mit einer for-Schleife durchlaufen werden, es muss
immer eine foreach-Schleife verwendet werden.
› Jeder Eintrag ist vom Typ: DictionaryEntry
› Zugriff auf einzelne Elemente erfolgt über Array-Klammern
SortedList
Die SortedList speichert Key-Value-Paare von beliebigen Typen.
› Der Key muss eindeutig sein und darf nicht null sein.
› Elemente werden in der Reihenfolge der Keys gespeichert (der Typ
des Key muss ggf. IComparer implementieren).
› Besonderheit bei den Keys: Der Typ des ersten Elements
bestimmt den Typ für die restlichen Elemente (Nebeneffekt der
Sortierung).
› Der Zugriff auf die Elemente kann über den Key oder über den
Index erfolgen
Stack
Der Stack speichert Elemente beliebigen Typs nach dem LIFO-
Prinzip (Last In, First Out).
› Es kann immer nur ein Element auf den Stack gelegt werden, bzw.
das oberste Element entnommen werden.
› Darüber hinaus bietet ein Stack noch die Möglichkeit das oberste
Element anzusehen ohne es zu entfernen, sowie zu prüfen, ob ein
Element im Stack vorhanden ist.
› Ein Zugriff auf andere Elemente, etwa durch einen Index, ist nicht
möglich.
› Ein Stack kann mit einer foreach-Schleife durchlaufen werden.
Auszug von Stack-Methoden
Push, Pop, Peek
Queue
Die Queue speichert Elemente beliebigen Typs nach dem FIFO-
Prinzip (First In, First Out).
› Es kann ein Element an das Ende der Queue angefügt werden,
bzw. das erste Element der Queue entnommen werden.
› Darüber hinaus bietet eine Queue noch die Möglichkeit das erste
Element anzusehen ohne es zu entfernen, sowie zu prüfen, ob ein
Element in der Queue vorhanden ist.
› Ein Zugriff auf andere Elemente, etwa durch einen Index, ist nicht
möglich.
› Eine Queue kann mit einer foreach-Schleife durchlaufen werden.
Auszug von Queue-Methoden
Enqueue, Deququq, Peek