Auswählen einer Auflistungsklasse
Achten Sie darauf, dass Sie Ihre Auflistungsklasse sorgfältig auswählen. Ein falscher Typ kann die Verwendung der Auflistung einschränken.
Wichtig
Vermeiden Sie die Verwendung der Typen im System.Collections-Namespace. Die generischen und parallelen Versionen der Auflistungen werden empfohlen, weil sie größere Typsicherheit und andere Optimierungen aufweisen.
Stellen Sie sich die folgenden Fragen:
Benötigen Sie eine sequenzielle Liste, in der das Element normalerweise verworfen wird, nachdem sein Wert abgerufen wurde?
Wenn dies der Fall ist, können Sie ggf. die Klasse Queue oder die generische Klasse Queue<T> verwenden, wenn Sie FIFO-Verhalten (First In, First Out) benötigen. Sie können ggf. die Klasse Stack oder die generische Klasse Stack<T> verwenden, wenn Sie LIFO-Verhalten (Last In, First Out) benötigen. Verwenden Sie für sicheren Zugriff aus mehreren Threads die parallelen Versionen ConcurrentQueue<T> und ConcurrentStack<T>. Bei Unveränderlichkeit sollten Sie die unveränderlichen Versionen ImmutableQueue<T> und ImmutableStack<T> in Erwägung ziehen.
Wenn dies nicht der Fall ist, ziehen Sie die Verwendung anderer Auflistungen in Betracht.
Benötigen Sie Zugriff auf die Elemente in einer bestimmten Reihenfolge, z. B. FIFO, LIFO oder zufällig?
Die Klasse Queue sowie die generischen Klassen Queue<T>, ConcurrentQueue<T> und ImmutableQueue<T> bieten alle einen FIFO-Zugriff. Weitere Informationen finden Sie unter Verwendung einer threadsicheren Sammlung.
Die Klasse Stack sowie die generischen Klassen Stack<T>, ConcurrentStack<T> und ImmutableStack<T> bieten alle einen LIFO-Zugriff. Weitere Informationen finden Sie unter Verwendung einer threadsicheren Sammlung.
Die generische Klasse LinkedList<T> ermöglicht sequenziellen Zugriff von oben nach unten oder von unten nach oben.
Benötigen Sie Zugriff auf jedes Element über den Index?
Die Klassen ArrayList und StringCollection und die generische Klasse List<T> bieten Zugriff auf ihre Elemente über den nullbasierten Index des Elements. Bei Unveränderlichkeit sollten Sie die unveränderlichen generischen Versionen ImmutableArray<T> und ImmutableList<T> in Erwägung ziehen.
Die Klassen Hashtable, SortedList, ListDictionary und StringDictionary sowie die generischen Klassen Dictionary<TKey,TValue> und SortedDictionary<TKey,TValue> bieten Zugriff auf ihre Elemente über den Schlüssel des Elements. Es gibt außerdem unveränderliche Versionen von mehreren entsprechenden Typen: ImmutableHashSet<T>, ImmutableDictionary<TKey,TValue>, ImmutableSortedSet<T> und ImmutableSortedDictionary<TKey,TValue>.
Die Klassen NameObjectCollectionBase und NameValueCollection sowie die generischen Klassen KeyedCollection<TKey,TItem> und SortedList<TKey,TValue> bieten Zugriff auf ihre Elemente über den nullbasierten Index oder den Schlüssel des Elements.
Enthält jedes Element einen Wert, eine Kombination aus einem Schlüssel und einem Wert oder eine Kombination aus einem Schlüssel und mehreren Werten?
Ein Wert: Verwenden Sie eine beliebige auf der IList-Schnittstelle oder der generischen Schnittstelle IList<T> basierende Collection. Bei einer unveränderlichen Option sollten Sie die generische Schnittstelle IImmutableList<T> in Betracht ziehen.
Ein Schlüssel und ein Wert: Verwenden Sie eine beliebige auf der IDictionary-Schnittstelle oder der generischen Schnittstelle IDictionary<TKey,TValue> basierende Collection. Bei einer unveränderlichen Option sollten Sie die generischen Schnittstellen IImmutableSet<T> oder IImmutableDictionary<TKey,TValue> in Betracht ziehen.
Ein Wert mit eingebettetem Schlüssel: Verwenden Sie die generische KeyedCollection<TKey,TItem>-Klasse.
Ein Schlüssel und mehrere Werte: Verwenden Sie die NameValueCollection-Klasse.
Müssen Sie die Elemente abweichend von ihrer Eingabereihenfolge sortieren?
Die Klasse Hashtable sortiert ihre Elemente anhand ihrer Hashcodes.
Die SortedList-Klasse und die generischen Klassen SortedList<TKey,TValue> und SortedDictionary<TKey,TValue> sortieren ihre Elemente nach dem Schlüssel. Die Sortierreihenfolge basiert auf der Implementierung der IComparer-Schnittstelle für die SortedList-Klasse und auf der Implementierung der generischen IComparer<T>-Schnittstelle für die generischen Klassen SortedList<TKey,TValue> und SortedDictionary<TKey,TValue>. Von den beiden generischen Typen bietet SortedDictionary<TKey,TValue> eine bessere Leistung als SortedList<TKey,TValue>, während SortedList<TKey,TValue> weniger Arbeitsspeicher belegt.
ArrayList stellt eine Methode Sort bereit, die eine IComparer-Implementierung als Parameter annimmt. Ihre generische Entsprechung, diegenerische Klasse List<T> stellt eine Methode Sort bereit, die eine Implementierung der generischen IComparer<T>-Schnittstelle als Parameter annimmt.
Benötigen Sie schnelle Suchvorgänge und schnellen Abruf von Informationen?
- ListDictionary ist schneller als Hashtable bei kleinen Auflistungen (mit höchstens 10 Elementen). Die generische Klasse Dictionary<TKey,TValue> stellt schnellere Suchvorgänge als die generische Klasse SortedDictionary<TKey,TValue> bereit. Die Multithreadimplementierung ist ConcurrentDictionary<TKey,TValue>. ConcurrentBag<T> stellt schnelle Multithreadeinfügung für unsortierte Daten bereit. Weitere Informationen zu beiden Multithreadtypen finden Sie unter Verwendung einer threadsicheren Auflistung.
Benötigen Sie Auflistungen, die nur Zeichenfolgen annehmen?
StringCollection (basierend auf IList) und StringDictionary (basierend auf IDictionary) befinden sich im System.Collections.Specialized-Namespace.
Darüber hinaus können Sie eine beliebige generische Auflistungsklasse im System.Collections.Generic-Namespace als stark typisierte Zeichenfolgenauflistungen verwenden, indem Sie die Klasse String für ihre generischen Typargumente angeben. Sie können z.B. eine Variable vom Typ List<String> oder Dictionary<String,String> deklarieren.
LINQ to Objects und PLINQ
Mit der LINQ to Objects-Funktion können Entwickler LINQ-Abfragen für den Zugriff auf Objekte im Arbeitsspeicher verwenden, wenn der Objekttyp IEnumerable oder IEnumerable<T> implementiert. LINQ-Abfragen bieten ein allgemeines Muster für den Datenzugriff, sind normalerweise präziser und besser lesbar als standardmäßige foreach
-Schleifen und stellen Filter-, Sortier- und Gruppierungsfunktionen bereit. Weitere Informationen finden Sie unter LINQ to Objects (C#) und LINQ to Objects (Visual Basic).
PLINQ stellt eine parallele Implementierung von LINQ to Objects bereit, die in vielen Szenarien eine schnellere Abfrageausführung durch eine effizientere Verwendung von Computern mit mehreren Kernen bietet. Weitere Informationen finden Sie unter Parallel LINQ (PLINQ) (Paralleles LINQ (PLINQ)).