Auswählen einer Auflistungsklasse
Wählen Sie die entsprechende Auflistungsklasse mit Bedacht. Wenn der falsche Typ ausgewählt wird, kann dies die Verwendung der Auflistung einschränken. Verwenden Sie die Typen im System.Collections-Namespace im Allgemeinen nicht, sofern Sie nicht speziell .NET Framework, Version 1.1, als Zielversion festgelegt haben. Die generischen und gleichzeitigen Versionen der Auflistungen sollten wegen ihrer größeren Typsicherheit und anderer Verbesserungen vorgezogen werden.
Beachten Sie Folgendes:
Benötigen Sie eine sequenzielle Liste, bei der ein Element normalerweise verworfen werden kann, wenn sein Wert abgerufen wurde?
Wenn dies zutrifft, sollten Sie die Verwendung der Queue-Klasse oder der generischen Queue<T>-Klasse in Erwägung ziehen, falls First In, First Out (FIFO)-Verhalten erforderlich ist. Falls Sie Last in, First out (LIFO)-Verhalten benötigen, sollten Sie die Stack-Klasse oder die generische Stack<T>-Klasse in Erwägung ziehen. Verwenden Sie für sicheren Zugriff auf mehrere Threads die parallelen Versionen ConcurrentQueue<T> und ConcurrentStack<T>.
Falls nicht, verwenden Sie die übrigen Auflistungen.
Benötigen Sie Zugriff auf Elemente in einer bestimmten Reihenfolge, z. B. FIFO-, LIFO- oder beliebiger Reihenfolge?
Die Queue-Klasse und die generische Queue<T>-Klasse oder die ConcurrentQueue<T>-Klasse ermöglichen FIFO-Zugriff. Weitere Informationen finden Sie unter Verwendung einer threadsicheren Auflistung.
Die Stack-Klasse und die generische Stack<T>-Klasse oder die ConcurrentStack<T>-Klasse ermöglichen LIFO-Zugriff. Weitere Informationen finden Sie unter Verwendung einer threadsicheren Auflistung.
Bei der generischen LinkedList<T>-Klasse ist ein sequenzieller Zugriff entweder von oben nach unten oder von unten nach oben möglich.
Möchten Sie auf die einzelnen Elemente mithilfe eines Indizes zugreifen?
Auf die Elemente der ArrayList-Klasse und der StringCollection-Klasse sowie der generischen List<T>-Klasse kann über den nullbasierten Index des Elements zugegriffen werden.
Auf die Elemente der Klassen Hashtable, SortedList, ListDictionary und StringDictionary und auf die Elemente der generischen Dictionary<TKey, TValue>-Klasse und der generischen SortedDictionary<TKey, TValue>-Klasse kann über den Schlüssel des Elements zugegriffen werden.
Auf die Elemente der NameObjectCollectionBase-Klasse und der NameValueCollection-Klasse und auf die Elemente der generischen KeyedCollection<TKey, TItem>-Klasse und der generischen SortedList<TKey, TValue>-Klasse kann über den nullbasierten Index oder den Schlüssel des Elements zugegriffen werden.
Wird jedes Element einen Wert enthalten, eine Kombination aus einem Schlüssel und einem Wert oder eine Kombination aus einem Schlüssel und mehreren Werten?
Ein Wert: Verwenden Sie eine der Auflistungen, die auf der IList-Schnittstelle oder der generischen IList<T>-Schnittstelle basiert.
Ein Schlüssel und ein Wert: Verwenden Sie eine der Auflistungen, die auf der IDictionary-Schnittstelle oder der generischen IDictionary<TKey, TValue>-Schnittstelle basiert.
Ein Wert mit eingebettetem Schlüssel: Verwenden Sie die allgemeine KeyedCollection<TKey, TItem>-Klasse.
Ein Schlüssel und mehrere Werte: Verwenden Sie die NameValueCollection-Klasse.
Müssen die Elemente unabhängig von der Reihenfolge ihrer Eingabe sortiert werden?
Die Hashtable-Klasse sortiert ihre Elemente anhand ihrer Hashcodes.
Die SortedList-Klasse sowie die generische SortedDictionary<TKey, TValue>-Klasse und die generische SortedList<TKey, TValue>-Klasse sortieren ihre Elemente nach dem Schlüssel auf der Grundlage der Implementierungen der IComparer-Schnittstelle und der generischen IComparer<T>-Schnittstelle.
ArrayList stellt eine Sort-Methode bereit, die eine IComparer-Implementierung als Parameter akzeptiert. Ihre generische Entsprechung, die generische List<T>-Klasse, stellt eine Sort-Methode bereit, die eine Implementierung der generischen IComparer<T>-Schnittstelle als Parameter akzeptiert.
Ist schnelles Suchen und Abrufen von Informationen erforderlich?
- ListDictionary ist bei kleinen Auflistungen (mit höchstens 10 Elementen) schneller als Hashtable. Bei der generischen Dictionary<TKey, TValue>-Klasse werden Suchvorgänge schneller als bei der generischen SortedDictionary<TKey, TValue>-Klasse ausgeführt. Die Multithreadimplementierung ist ConcurrentDictionary<TKey, TValue>. ConcurrentBag<T> stellt schnelle Multithreadeinfügung für ungeordnete Daten bereit. Weitere Informationen zu beiden Multithreadtypen finden Sie unter Verwendung einer threadsicheren Auflistung.
Werden Auflistungen gebraucht, die nur Zeichenfolgen annehmen?
StringCollection (basierend auf IList) und StringDictionary (basierend auf IDictionary) befinden sich im System.Collections.Specialized-Namespace.
Außerdem können Sie jede der generischen Auflistungsklassen im System.Collections.Generic-Namespace als stark typisierte Zeichenfolgenauflistungen verwenden, indem Sie die String-Klasse für ihre generischen Typargumente angeben.
LINQ to Objects und PLINQ
Mit LINQ to Objects können Entwickler LINQ-Abfragen für den Zugriff auf Objekte im Arbeitsspeicher verwenden, solange 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-zu-Objekte.
PLINQ stellt eine parallele Implementierung von LINQ to Objects bereit, die in zahlreichen Szenarien eine schnellere Abfrageausführung durch effizientere Verwendung von Computern mit mehreren Kernen bietet. Weitere Informationen finden Sie unter Paralleles LINQ (PLINQ).
Siehe auch
Referenz
System.Collections.Specialized