Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Achten Sie darauf, Dass Sie Ihre Sammlungsklasse sorgfältig auswählen. Die Verwendung des falschen Typs kann die Verwendung der Sammlung einschränken.
Von Bedeutung
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.
Berücksichtigen Sie die folgenden Fragen:
Benötigen Sie eine sequenzielle Liste, in der das Element normalerweise nach dem Abrufen des Werts verworfen wird?
Wenn ja, sollten Sie die Queue Klasse oder die Queue<T> allgemeine Klasse verwenden, wenn Sie das First-In-First-Out-Verhalten (FIFO) benötigen. Erwägen Sie die Verwendung der Stack Klasse oder der Stack<T> generischen Klasse, wenn Sie das Verhalten von last-in, first-out (LIFO) benötigen. Verwenden Sie für den sicheren Zugriff von mehreren Threads die gleichzeitigen Versionen ConcurrentQueue<T> und ConcurrentStack<T>. Berücksichtigen Sie zur Unveränderlichkeit die unveränderlichen Versionen ImmutableQueue<T> und ImmutableStack<T>.
Falls nicht, ziehen Sie die Verwendung der anderen Sammlungen in Betracht.
Müssen Sie auf die Elemente in einer bestimmten Reihenfolge zugreifen, z. B. FIFO, LIFO oder zufällig?
Die Queue Klasse sowie die Queue<T>, ConcurrentQueue<T>und ImmutableQueue<T> generischen Klassen bieten alle FIFO-Zugriff. Weitere Informationen finden Sie unter Wann man eine Thread-Safe-Auflistung verwenden sollte.
Die Stack Klasse sowie die Stack<T>, ConcurrentStack<T>und ImmutableStack<T> generischen Klassen bieten alle LIFO-Zugriff. Weitere Informationen finden Sie unter Wann man eine Thread-Safe-Auflistung verwenden sollte.
Die LinkedList<T> generische Klasse ermöglicht sequenziellen Zugriff vom Kopf zum Schwanz oder vom Schwanz bis zum Kopf.
Benötigen Sie Zugriff auf jedes Element über den Index?
Die ArrayList Klassen und StringCollection die List<T> generische Klasse bieten Zugriff auf ihre Elemente durch den nullbasierten Index des Elements. Berücksichtigen Sie zur Unveränderlichkeit die unveränderlichen generischen Versionen ImmutableArray<T> und ImmutableList<T>.
Die Hashtable, SortedList, ListDictionary, und StringDictionary Klassen sowie die Dictionary<TKey,TValue> und SortedDictionary<TKey,TValue> generischen Klassen ermöglichen den Zugriff auf ihre Elemente anhand des Schlüssels. Darüber hinaus gibt es unveränderliche Versionen verschiedener entsprechender Typen: ImmutableHashSet<T>, , ImmutableDictionary<TKey,TValue>, ImmutableSortedSet<T>und ImmutableSortedDictionary<TKey,TValue>.
Die NameObjectCollectionBase Klassen und NameValueCollection klassen sowie die KeyedCollection<TKey,TItem> und SortedList<TKey,TValue> generischen Klassen bieten Zugriff auf ihre Elemente entweder durch 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 der Auflistungen, die auf der IList Schnittstelle oder der IList<T> generischen Schnittstelle basieren. Berücksichtigen Sie für eine unveränderliche Option die IImmutableList<T> generische Schnittstelle.
Ein Schlüssel und ein Wert: Verwenden Sie eine der Auflistungen basierend auf der IDictionary Schnittstelle oder der IDictionary<TKey,TValue> generischen Schnittstelle. Berücksichtigen Sie bei einer unveränderlichen Option die generischen Schnittstellen IImmutableSet<T> oder IImmutableDictionary<TKey,TValue>.
Ein Wert mit eingebetteten Schlüsseln: Verwenden Sie die KeyedCollection<TKey,TItem> generische Klasse.
Ein Schlüssel und mehrere Werte: Verwenden Sie die NameValueCollection Klasse.
Müssen Sie die Elemente anders sortieren als die eingegebenen Elemente?
Die Hashtable Klasse sortiert ihre Elemente nach ihren Hashcodes.
Die SortedList Klasse und die SortedList<TKey,TValue> generischen SortedDictionary<TKey,TValue> Klassen 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 IComparer<T> generischen Schnittstelle für die SortedList<TKey,TValue> und SortedDictionary<TKey,TValue> generische Klassen. Von den beiden generischen Typen bietet SortedDictionary<TKey,TValue> eine bessere Leistung als SortedList<TKey,TValue>, während SortedList<TKey,TValue> weniger Arbeitsspeicher verbraucht.
ArrayList stellt eine Sort Methode bereit, die eine IComparer Implementierung als Parameter verwendet. Das generische Gegenstück, die List<T> generische Klasse, stellt eine Sort Methode bereit, die eine Implementierung der IComparer<T> generischen Schnittstelle als Parameter verwendet.
Benötigen Sie schnelle Suchen und Abrufen von Informationen?
- ListDictionary ist schneller als Hashtable für kleine Sammlungen (10 Elemente oder weniger). Die Dictionary<TKey,TValue> generische Klasse bietet eine schnellere Suche als die SortedDictionary<TKey,TValue> generische Klasse. 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 Sammlungen, die nur Zeichenfolgen akzeptieren?
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
LINQ to Objects ermöglicht Es Entwicklern, LINQ-Abfragen für den Zugriff auf In-Memory-Objekte zu verwenden, solange der Objekttyp implementiert IEnumerable oder IEnumerable<T>. LINQ-Abfragen stellen ein gängiges Muster für den Zugriff auf Daten bereit, sind in der Regel präziser und lesbarer als Standardschleifen foreach
und bieten Filter-, Sortier- und Gruppierungsfunktionen. Weitere Informationen finden Sie unter LINQ to Objects (C#) und LINQ to Objects (Visual Basic).
PLINQ bietet eine parallele Implementierung von LINQ to Objects, die eine schnellere Abfrageausführung in vielen Szenarien durch eine effizientere Verwendung von Multi-Core-Computern bieten kann. Weitere Informationen finden Sie unter Parallel LINQ (PLINQ).For more information, see Parallel LINQ (PLINQ).