Laden...

[Übersicht] Collections (Auflistungen) ab .NET Framework 2.0

Erstellt von gelöschtem Konto vor 15 Jahren Letzter Beitrag vor 15 Jahren 26.081 Views
Gelöschter Account
vor 15 Jahren
[Übersicht] Collections (Auflistungen) ab .NET Framework 2.0

Hier findet ihr eine Übersicht über die wichtigsten Collections aus dem in .NET 2.0 eingeführten Namespace System.Collections.Generic. Zu jeder Collection sind Einsatzgebiet, Vor- und Nachteile sowie die Operationen zum Hinzufügen und Entfernen von Elementen angegeben. Diese Übersicht soll einen schnellen Überblick über die relevanten Collections geben und die Auswahl der richtigen Collection für den jeweiligen Zweck erleichtern. Folgende Collections werden behandelt:

.net 2.0

  1. System.Collections.Generic.List<>
  2. System.Collections.Generic.LinkedList<>
  3. System.Collections.Generic.Queue<>
  4. System.Collections.Generic.Stack<>
  5. System.Collections.ObjectModel.Collection<>
  6. System.Collections.ObjectModel.ReadOnlyCollection<>
  7. System.Collections.Generic.Dictionary<,>
  8. System.Collections.Generic.SortedDictionary<,>
  9. System.Collections.Generic.SortedList<,>
  10. System.ComponentModel.BindingList<>

.net 2.0

1. List<T>


[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>, 
    IEnumerable<T>, IList, ICollection, IEnumerable

Einsatzgebiet:
Überall, wo keine spezialisierte Liste/Collection passt.
Dies ist die Standardliste und somit die wohl am häufigsten verwendete. Mit deren Methoden sollte man sich genauestens auseinandersetzen, da man häufig damit in Kontakt kommt.

Vorteile:
Viele Methoden zum Suchen, Einfügen, Sortieren und Manipulieren der Daten verfügbar.

Nachteile:
Einfügen und Entfernen von Elementen am Anfang oder der Mitte der Liste sind relativ teuere O(n)-Operationen.
Größeren Listen landen auf dem LOH (Large Object Heap)

Elemente hinzufügen:
Add : "Fügt am Ende der List<T> ein Objekt hinzu."
AddRange: "Fügt die Elemente der angegebenen Auflistung am Ende von List<T> hinzu."
Insert: "Fügt am angegebenen Index ein Element in die List<T> ein."
InsertRange: "Fügt die Elemente einer Auflistung am angegebenen Index in die List<T> ein."

Elemente entfernen:
Remove: "Entfernt das erste Vorkommen eines angegebenen Objekts aus List<T>."
RemoveAll: "Entfernt alle Elemente, die die vom angegebenen Prädikat definierten Bedingungen erfüllen."
RemoveAt: "Entfernt das Element am angegebenen Index aus der List<T>."
RemoveRange: "Entfernt einen Bereich von Elementen aus der List<T>."

2. LinkedList<T>

[SerializableAttribute] 
[ComVisibleAttribute(false)] 
public class LinkedList<T> : ICollection<T>, IEnumerable<T>, 
    ICollection, IEnumerable, ISerializable, IDeserializationCallback

Einsatzgebiet:
Wenn man viele Insert- und Remove-Operationen innerhalb einer Liste vornehmen möchte, jedoch den indexbasierten Zugriff nicht benötigt. Mit dieser Klasse kann man eine sehr große Liste innerhalb kurzer Zeit aufbauen, ohne beim Hinzufügen von Elementen innerhalb der Liste (also z.B. an Position x) Performance einzubüßen.
Auch das Durchlaufen der Liste ist ausreichend performant, da jedes Element durch eine Klasse gekapselt ist, welche das vorige Element und das nächste Element kennt (Eine verkettete Liste).

Vorteile:
Schneller Einfügevorgang an beliebiger Position und Entfernen von Knoten ( beides O1).
Bei größeren Listen landet diese nicht auf dem LOH (Large Object Heap)

Nachteile:
Kein Zugriff über Indexer möglich.
Leichter Overhead je Element, da diese in eine Klasse gekapselt werden.

Elemente hinzufügen:
AddAfter: "Fügt nach einem vorhandenen Knoten in der LinkedList einen neuen Knoten oder Wert hinzu. "
AddBefore: "Fügt vor einem vorhandenen Knoten in der LinkedList einen neuen Knoten oder Wert hinzu. "
AddFirst: "Fügt am Anfang der LinkedList einen neuen Knoten oder Wert hinzu. "
AddLast: "Fügt am Ende der LinkedList einen neuen Knoten oder Wert hinzu. "

Elemente entfernen:
Remove: "Entfernt das erste Vorkommen eines Knotens oder Werts aus der LinkedList. "
RemoveFirst: "Entfernt den Knoten am Anfang der LinkedList. "
RemoveLast: "Entfernt den Knoten am Ende der LinkedList. "

3. Queue<T>


[SerializableAttribute]
[ComVisibleAttribute(false)]
public class Queue<T> : IEnumerable<T>, ICollection, 
    IEnumerable

Einsatzgebiet:
Immer dann, wenn Nachrichten oder Aufträge in genau der Reihenfolge abgearbeitet werden müssen, in der diese auftreten/eintreffen.

Beispiele die eine Synchronisierung voraussetzen (siehe auch Simple SyncQueue):
JobQueue: Wenn man z.b. einen Arbeits-Thread hat, kann man ihn mithilfe einer Queue Aufträge vergeben, ohne warten zu müssen, das der Thread Zeit hat.
MessageQueue: Häufig in Server-Client-Systemen am Server implementiert. Dort werden alle Anfragen der Clients an den Server geschrieben, damit der Server die Anfragen sequenziell abarbeiten kann (siehe auch Bulk Queue-Klasse und Applikation mit Warteschlange)

Vorteile:
First in first out Prinzip.
Eingebaute Sequenzierung der Daten.
Innerhalb ihres Aufgabengebietes ist die Queue performant.

Nachteile:
Kein indexbasierter Zugriff.
Kein Zugriff auf beliebige Elemente innerhalb der Queue möglich (wenn 5 Elemente in der Queue sind, so muss man bei einem gewollten Zugriff auf Element Nr. 3 zuerst Element 1 und 2 von der Queue holen).
Ken Hinzufügen innerhalb der Queue möglich (man kann nicht an Position x (wobei x != Count) ein Element einfügen.

Elemente hinzufügen:
Enqueue: "Fügt am Ende der Queue<T> ein Objekt hinzu."

Elemente entfernen:
Dequeue: "Entfernt das Objekt am Anfang von Queue<T> und gibt es zurück."

4. Stack<T>

[SerializableAttribute]
[ComVisibleAttribute(false)]
public class Stack<T> : IEnumerable<T>, ICollection, 
    IEnumerable

Einsatzgebiet:
Für Undo und Redo Features unerlässlich.

Vorteile:
Last in first out Prinzip.
Wenn Count kleiner als die Kapazität des Stapels ist, ist Push eine O(1)-Operation. Wenn die Kapazität zur Anpassung an das neue Element erhöht werden muss, wird Push zu einer O(n)-Operation, wobei n gleich Count ist. Pop ist eine O(1)-Operation. (zu Push und Pop siehe "Elemente hinzufügen/entfernen")

Nachteile:
Kein indexbasierter Zugriff.
Kein Zugriff auf beliebige Elemente innerhalb des Stack möglich (wenn 5 Elemente im Stack sind, so muss man bei einem gewollten Zugriff auf Element Nr. 3 zuerst Element 5 und 4 vom Stack holen).

Elemente hinzufügen:
Push: "Fügt ein Objekt am Anfang von Stack<T> ein."

Elemente entfernen:
Pop: "Entfernt das oberste Objekt aus Stack<T> und gibt es zurück."

5. System.Collections.ObjectModel.Collection<T>


[SerializableAttribute]
[ComVisibleAttribute(false)]
public class Collection<T> : IList<T>, 
    ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

Einsatzgebiet:
Dient als Basis für Collections in denen eine spezielle Funktionalität erwartet wird, welche nicht von einer anderen Framework-Klasse bereitgestellt wird.

Vorteile:
Die Collection<T>-Klasse stellt geschützte Methoden bereit, mit denen das Verhalten der Klasse beim Hinzufügen und Entfernen von Elementen, beim Löschen der Auflistung und beim Festlegen des Werts eines bestehenden Elements angepasst werden kann.

Nachteile:
Einfügen und Entfernen von Elementen am Anfang oder der Mitte der Liste sind relativ teuere O(n)-Operationen.
Größeren Listen landen auf dem LOH (Large Object Heap)

Elemente hinzufügen:
Add: "Fügt am Ende der Collection<T> ein Objekt hinzu."
Insert: "Fügt am angegebenen Index ein Element in die Collection<T> ein."

Elemente entfernen:
Remove: "Entfernt das erste Vorkommen eines bestimmten Objekts aus der Collection<T>."
RemoveAt: "Entfernt das Element am angegebenen Index aus der Collection<T>."

6. System.Collections.ObjectModel.ReadOnlyCollection<T>

[SerializableAttribute]
[ComVisibleAttribute(false)]
public class ReadOnlyCollection<T> : IList<T>, 
    ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

Einsatzgebiet:
Wenn man programmatisch eine Collection erstellt und verhindern möchte das eine z.B. fremde Instanz diese Collection ändert.
Sobald diese Collection instantiiert ist, kann man diese nicht mehr verändern.

Vorteile:
Schreibgeschützte Collection.
Diese Basisklasse wird bereitgestellt, um das Erstellen einer generischen, schreibgeschützten Auflistung bei der Implementierung zu vereinfachen. Bei der Implementierung empfiehlt es sich, diese Basisklasse zu erweitern, anstatt eine eigene zu erstellen.

Nachteile:
Wirft eine Exception beim schreibenden Zugriff.

Elemente hinzufügen:
Nur innerhalb des Konstruktors möglich.

Elemente entfernen:

7. Dictionary<TKey,TValue>

[SerializableAttribute]
[ComVisibleAttribute(false)]
public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>, 
    ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, 
    IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback

Einsatzgebiet:
Sobald Listen mit sehr schnellem Zugriff anhand eines Schlüssels beliebigen Typs benötigt werden.

Vorteile:
Sehr schnelles Abrufen eines Values anhand eines frei definierbaren, eindeutigen Schlüssels (beinahe ein O(1) Vorgang)

Nachteile:
Schlüssel muss eindeutig sein.
Die Performance des Abrufens von Values hängt stark von der GetHashCode-Implementierung des Schlüssels ab.

Elemente hinzufügen:
Add: "Fügt dem Wörterbuch den angegebenen Schlüssel und Wert hinzu."

Elemente entfernen:
Remove: "Entfernt den Wert mit dem angegebenen Schlüssel aus dem Dictionary."

8. SortedDictionary<TKey,TValue>


[SerializableAttribute] 
public class SortedDictionary<TKey,TValue> : IDictionary<TKey,TValue>, ICollection<KeyValuePair<TKey,TValue>>, 
    IEnumerable<KeyValuePair<TKey,TValue>>, IDictionary, ICollection, IEnumerable

Einsatzgebiet:
Wenn jederzeit sortierte Daten für Iterationen benötigt werden, welche jedoch im unsortierten Zustand hinzugefügt/entfernt werden.

Vorteile:
Unsortierte Daten werden vom SortedDictionary schneller hinzugefügt und entfernt: O(log n) im Gegensatz zu O(n) bei der SortedList<TKey,TValue>.
Relativ schneller Zugriff auf Values (O(log n)) durch die binäre Suchstruktur.

Nachteile:
Mehr Speicherverbrauch als SortedList<TKey,TValue>
Wenn die Liste in einem Vorgang mit sortierten Daten gefüllt wird, ist die SortedList schneller als das SortedDictionary.

Elemente hinzufügen:
Add: "Fügt dem SortedDictionary ein Element mit dem angegebenen Schlüssel und Wert hinzu."

Elemente entfernen:
Remove: "Entfernt das Element mit dem angegebenen Schlüssel aus dem SortedDictionary."

9. SortedList<TKey,TValue>

[SerializableAttribute] 
[ComVisibleAttribute(false)] 
public class SortedList<TKey,TValue> : IDictionary<TKey,TValue>, ICollection<KeyValuePair<TKey,TValue>>, 
    IEnumerable<KeyValuePair<TKey,TValue>>, IDictionary, ICollection, IEnumerable

Einsatzgebiet:
Wenn jederzeit sortierte Daten benötigt werden, welche aber in der Regel bereits sortiert hinzugefügt werden.

Vorteile:
SortedList benötigt weniger Speicher als SortedDictionary.
Wenn die Liste in einem Vorgang mit sortierten Daten gefüllt wird, ist die SortedList schneller als das SortedDictionary.
Bessere Performance bei Iterierungen als SortedDictionary.

Nachteile:
Unsortierte Daten werden vom SortedDictionary schneller hinzugefügt und entfernt: O(log n) im Gegensatz zu O(n) bei der SortedList.

Elemente hinzufügen:
Add: "Fügt der SortedList ein Element mit dem angegebenen Schlüssel und Wert hinzu."

Elemente entfernen:
Remove: "Entfernt das Element mit dem angegebenen Schlüssel aus der SortedList."
RemoveAt: "Entfernt das Element am angegebenen Index aus der SortedList."

10. System.ComponentModel.BindingList<T>


[SerializableAttribute] 
public class BindingList<T> : Collection<T>, IBindingList, IList, ICollection, 
    IEnumerable, ICancelAddNew, IRaiseItemChangedEvents

Einsatzgebiet:
DataBinding-Szenarien.
Immer dann, wenn man informiert werden möchte, wenn sich an der Auflistung etwas ändert.
Siehe auch: ObservableCollection für .Net 2.0

Vorteile:
Viele Events, die ausgelöst werden, wenn sich an der Auflistung etwas ändert.
Unterstützt DataBinding.

Nachteile:
Einfügen und Entfernen von Elementen am Anfang oder der Mitte der Liste sind relativ teuere O(n)-Operationen.
Größeren Listen landen auf dem LOH (Large Object Heap)

Elemente hinzufügen:
Add: "Fügt am Ende der Collection ein Objekt hinzu. (Von Collection geerbt.)"
AddNew: "Fügt der Auflistung ein neues Element hinzu."

Elemente entfernen:
Remove: "Entfernt das erste Vorkommen eines bestimmten Objekts aus der Collection. (Von Collection geerbt.)"
RemoveAt: "Entfernt das Element am angegebenen Index aus der Collection. (Von Collection geerbt.)"

Nicht Framework Collections:

  1. Wintellect's Power Collections for .NET
    Eine schöne Erweiterung zu den Framework collections.
  2. C5 Collections
    Eine umfangreiche Library mit vielen Collections, die sehr, sehr viel Funktionalität bieten.

besonderen Dank an (reihenfolge hat keinerlei Aussage und ist rein Zufällig):
herbivore
Peter Bucher
kleines_eichhoernchen
FZelle
jaensen
tom-essen