Auflistungen und DatenstrukturenCollections and Data Structures

Ähnliche Daten können häufig effizienter verarbeitet werden, wenn sie als eine Auflistung gespeichert und bearbeitet werden.Similar data can often be handled more efficiently when stored and manipulated as a collection. Sie können die System.Array-Klasse oder die Klassen in den Namespaces System.Collections, System.Collections.Generic, System.Collections.Concurrent und System.Collections.Immutable verwenden, um entweder einzelne Elemente oder Elementbereiche in einer Auflistung hinzuzufügen, zu entfernen und zu bearbeiten.You can use the System.Array class or the classes in the System.Collections, System.Collections.Generic, System.Collections.Concurrent, System.Collections.Immutable namespaces to add, remove, and modify either individual elements or a range of elements in a collection.

Es gibt zwei Grundarten von Auflistungen: generische Auflistungen und nicht generische Auflistungen.There are two main types of collections; generic collections and non-generic collections. Generische Auflistungen wurden in .NET Framework 2.0 hinzugefügt und bieten Auflistungen, die zum Zeitpunkt der Kompilierung typsicher sind.Generic collections were added in the .NET Framework 2.0 and provide collections that are type-safe at compile time. Aus diesem Grund bieten generische Auflistungen in der Regel eine bessere Leistung.Because of this, generic collections typically offer better performance. Generische Auflistungen akzeptieren beim Erstellen einen Typparameter und erfordern nicht, dass Sie eine Umwandlung in den und aus dem Object-Typ durchführen, wenn Sie Elemente aus der Auflistung hinzufügen oder entfernen.Generic collections accept a type parameter when they are constructed and do not require that you cast to and from the Object type when you add or remove items from the collection. Darüber hinaus werden die meisten generischen Auflistungen in Windows StoreWindows Store-Apps unterstützt.In addition, most generic collections are supported in Windows StoreWindows Store apps. Nicht generische Auflistungen speichern Elemente als Object, erfordern eine Umwandlung, und die meisten werden für die Windows StoreWindows Store-App-Entwicklung nicht unterstützt.Non-generic collections store items as Object, require casting, and most are not supported for Windows StoreWindows Store app development. Allerdings finden Sie möglicherweise in älterem Code auch nicht generische Auflistungen.However, you may see non-generic collections in older code.

Ab .NET Framework 4.NET Framework 4 stellen die Auflistungen im System.Collections.Concurrent-Namespace effiziente threadsichere Operationen für den Zugriff auf Auflistungselemente aus mehreren Threads bereit.Starting with the .NET Framework 4.NET Framework 4, the collections in the System.Collections.Concurrent namespace provide efficient thread-safe operations for accessing collection items from multiple threads. Die unveränderlichen Auflistungsklassen im Namespace „System.Collections.Immutable“ (NuGet-Paket) sind grundsätzlich threadsicher, da Vorgänge mit einer Kopie der ursprünglichen Auflistung ausgeführt werden und die ursprüngliche Auflistung nicht geändert werden kann.The immutable collection classes in the System.Collections.Immutable namespace (NuGet package) are inherently thread-safe because operations are performed on a copy of the original collection and the original collection cannot be modified.

Allgemeine AuflistungsfunktionenCommon collection features

Alle Auflistungen bieten Methoden zum Hinzufügen, Entfernen oder Suchen von Elementen in der Auflistung.All collections provide methods for adding, removing or finding items in the collection. Darüber hinaus teilen sich alle Auflistungen, die die ICollection-Schnittstelle oder die ICollection<T>-Schnittstelle direkt oder indirekt implementieren, diese Funktionen:In addition, all collections that directly or indirectly implement the ICollection interface or the ICollection<T> interface share these features:

  • Die Fähigkeit zum Enumerieren der AuflistungThe ability to enumerate the collection

    .NET Framework-Auflistungen implementieren entweder System.Collections.IEnumerable oder System.Collections.Generic.IEnumerable<T>, damit die Auflistung durchlaufen werden kann..NET Framework collections either implement System.Collections.IEnumerable or System.Collections.Generic.IEnumerable<T> to enable the collection to be iterated through. Ein Enumerator kann als beweglicher Zeiger auf ein Element in der Auflistung betrachtet werden.An enumerator can be thought of as a movable pointer to any element in the collection. Die Anweisung foreach, in und die For Each...Next-Anweisung verwenden den Enumerator, der mit der GetEnumerator-Methode verfügbar gemacht wird, und verbergen die Komplexität bei der Bearbeitung des Enumerators.The foreach, in statement and the For Each...Next Statement use the enumerator exposed by the GetEnumerator method and hide the complexity of manipulating the enumerator. Darüber hinaus gilt jede Auflistung, die System.Collections.Generic.IEnumerable<T> implementiert, als abfragbarer Typ und kann mit LINQ abgefragt werden.In addition, any collection that implements System.Collections.Generic.IEnumerable<T> is considered a queryable type and can be queried with LINQ. LINQ-Abfragen bieten ein allgemeines Muster für den Datenzugriff.LINQ queries provide a common pattern for accessing data. Sie sind normalerweise präziser und besser lesbar als standardmäßige foreach-Schleifen und bieten Filter-, Sortier- und Gruppierungsfunktionen.They are typically more concise and readable than standard foreach loops, and provide filtering, ordering and grouping capabilities. LINQ-Abfragen können auch die Leistung verbessern.LINQ queries can also improve performance. Weitere Informationen finden Sie unter LINQ to Objects, Parallel LINQ (PLINQ) und Einführung in LINQ-Abfragen (C#).For more information, see LINQ to Objects, Parallel LINQ (PLINQ) and Introduction to LINQ Queries (C#).

  • Die Möglichkeit, den Inhalt der Auflistung in ein Array zu kopierenThe ability to copy the collection contents to an array

    Alle Auflistungen können mit der CopyTo-Methode in ein Array kopiert werden. Die Reihenfolge der Elemente im neuen Array basiert jedoch auf der Reihenfolge, in der sie vom Enumerator zurückgegeben werden.All collections can be copied to an array using the CopyTo method; however, the order of the elements in the new array is based on the sequence in which the enumerator returns them. Das resultierende Array ist stets eindimensional mit einer unteren Grenze von 0 (Null).The resulting array is always one-dimensional with a lower bound of zero.

Viele Auflistungsklassen enthalten außerdem die folgenden Funktionen:In addition, many collection classes contain the following features:

  • Kapazität und ZähleigenschaftenCapacity and Count properties

    Die Kapazität einer Auflistung ist die Anzahl der Elemente, die sie enthalten kann.The capacity of a collection is the number of elements it can contain. Die Anzahl einer Auflistung ist die Anzahl der tatsächlich enthaltenen Elemente.The count of a collection is the number of elements it actually contains. Einige Auflistungen blenden die Kapazität oder die Anzahl oder beides aus.Some collections hide the capacity or the count or both.

    Die meisten Auflistungen erweitern ihre Kapazität automatisch, wenn die aktuelle Kapazität erreicht ist.Most collections automatically expand in capacity when the current capacity is reached. Der Speicher wird neu zugewiesen, und die Elemente werden aus der alten Auflistung in die neue kopiert.The memory is reallocated, and the elements are copied from the old collection to the new one. Dies reduziert den Code, der für die Verwendung der Auflistung erforderlich ist. Die Leistung der Auflistung kann dadurch allerdings beeinträchtigt werden.This reduces the code required to use the collection; however, the performance of the collection might be negatively affected. Beispiel: List<T>, wenn Count kleiner alsCapacity ist, ist das Hinzufügen eines Elements eine O(1)-Operation.For example, for List<T>, If Count is less than Capacity, adding an item is an O(1) operation. Wenn die Kapazität für das neue Element erhöht werden muss, ist das Hinzufügen eines Elements ein O(n)-Vorgang, wobei n Count ist.If the capacity needs to be increased to accommodate the new element, adding an item becomes an O(n) operation, where n is Count. Am besten vermeiden Sie Leistungsverluste aufgrund mehrerer Neuzuweisungen, indem Sie die anfängliche Kapazität als geschätzte Größe der Auflistung festlegen.The best way to avoid poor performance caused by multiple reallocations is to set the initial capacity to be the estimated size of the collection.

    Ein BitArray ist ein Sonderfall; die Kapazität ist identisch mit der Länge, die wiederum mit der Anzahl übereinstimmt.A BitArray is a special case; its capacity is the same as its length, which is the same as its count.

  • Eine konsistente UntergrenzeA consistent lower bound

    Die untere Grenze einer Auflistung ist der Index des ersten darin enthaltenen Elements.The lower bound of a collection is the index of its first element. Alle indizierten Auflistungen in den System.Collections-Namespaces haben eine untere Grenze von 0 (Null), d. h. sie sind 0-indiziert.All indexed collections in the System.Collections namespaces have a lower bound of zero, meaning they are 0-indexed. Array hat standardmäßig eine untere Grenze von 0; es kann jedoch eine andere Untergrenze definiert werden, wenn Sie eine Instanz der Array-Klasse mit Array.CreateInstance erstellen.Array has a lower bound of zero by default, but a different lower bound can be defined when creating an instance of the Array class using Array.CreateInstance.

  • Synchronisierung für den Zugriff von mehreren Threads (nur System.Collections-Klassen).Synchronization for access from multiple threads (System.Collections classes only).

    Nicht generische Auflistungstypen im System.Collections-Namespace bieten ein gewisses Maß an Thread-Sicherheit durch die Synchronisierung; in der Regel werden sie durch die SyncRoot- und IsSynchronized-Member verfügbar gemacht.Non-generic collection types in the System.Collections namespace provide some thread safety with synchronization; typically exposed through the SyncRoot and IsSynchronized members. Diese Auflistungen sind nicht standardmäßig Thread-sicher.These collections are not thread-safe by default. Wenn Sie skalierbaren und effizienten Multithreadzugriff auf eine Auflistung benötigen, verwenden Sie eine der Klassen im System.Collections.Concurrent-Namespace oder ziehen Sie den Einsatz einer unveränderlichen Auflistung in Erwägung.If you require scalable and efficient multi-threaded access to a collection, use one of the classes in the System.Collections.Concurrent namespace or consider using an immutable collection. Weitere Informationen finden Sie unter Threadsichere Auflistungen.For more information, see Thread-Safe Collections.

Auswählen einer AuflistungChoosing a collection

Im Allgemeinen sollten Sie generische Auflistungen verwenden.In general, you should use generic collections. Die folgende Tabelle beschreibt einige häufig auftretende Auflistungsszenarios sowie die Auflistungsklassen, die Sie für diese Szenarien verwenden können.The following table describes some common collection scenarios and the collection classes you can use for those scenarios. Wenn Sie sich mit der Arbeit mit generischen Auflistungen noch nicht auskennen, hilft Ihnen diese Tabelle bei der Auswahl der generischen Auflistung, die am besten für Ihre Aufgabe geeignet ist.If you are new to generic collections, this table will help you choose the generic collection that works the best for your task.

ZielI want to… Optionen für generische AuflistungenGeneric collection options Optionen für nicht generische AuflistungenNon-generic collection options Optionen für threadsichere oder unveränderliche AuflistungenThread-safe or immutable collection options
Speichern von Elementen als Schlüssel-Wert-Paare für die schnelle Suche nach SchlüsselStore items as key/value pairs for quick look-up by key Dictionary<TKey,TValue> Hashtable

(Eine Auflistung von Schlüssel-Wert-Paaren, die auf Grundlage des Hashcodes des Schlüssels geordnet sind.)(A collection of key/value pairs that are organize based on the hash code of the key.)
ConcurrentDictionary<TKey,TValue>

ReadOnlyDictionary<TKey,TValue>

ImmutableDictionary<TKey,TValue>
Zugriff auf die Elemente nach IndexAccess items by index List<T> Array

ArrayList
ImmutableList<T>

ImmutableArray
Verwenden von Elementen nach First-in-First-Out (FIFO)-PrinzipUse items first-in-first-out (FIFO) Queue<T> Queue ConcurrentQueue<T>

ImmutableQueue<T>
Verwenden von Daten nach Last-In-First-Out (LIFO)-PrinzipUse data Last-In-First-Out (LIFO) Stack<T> Stack ConcurrentStack<T>

ImmutableStack<T>
Zugriff auf Elemente in ReihenfolgeAccess items sequentially LinkedList<T> Keine EmpfehlungNo recommendation Keine EmpfehlungNo recommendation
Empfang von Benachrichtigungen, wenn Elemente der Auflistung hinzugefügt oder aus ihr entfernt werden.Receive notifications when items are removed or added to the collection. (Implementiert INotifyPropertyChanged und INotifyCollectionChanged)(implements INotifyPropertyChanged and INotifyCollectionChanged) ObservableCollection<T> Keine EmpfehlungNo recommendation Keine EmpfehlungNo recommendation
Sortierte AuflistungA sorted collection SortedList<TKey,TValue> SortedList ImmutableSortedDictionary<TKey,TValue>

ImmutableSortedSet<T>
Ein Satz für mathematische FunktionenA set for mathematical functions HashSet<T>

SortedSet<T>
Keine EmpfehlungNo recommendation ImmutableHashSet<T>

ImmutableSortedSet<T>

TitelTitle BeschreibungDescription
Auswählen einer AuflistungsklasseSelecting a Collection Class Beschreibt die verschiedenen Auflistungen und hilft Ihnen bei der Auswahl für Ihr Szenario.Describes the different collections and helps you select one for your scenario.
Häufig verwendete AuflistungstypenCommonly Used Collection Types Beschreibt häufig verwendete generische und nicht generische Auflistungstypen, z. B. System.Array, System.Collections.Generic.List<T> und System.Collections.Generic.Dictionary<TKey,TValue>.Describes commonly used generic and nongeneric collection types such as System.Array, System.Collections.Generic.List<T>, and System.Collections.Generic.Dictionary<TKey,TValue>.
Verwenden von generischen AuflistungenWhen to Use Generic Collections Erörtert die Verwendung generischer Auflistungstypen.Discusses the use of generic collection types.
Vergleiche und Sortierungen innerhalb von AuflistungenComparisons and Sorts Within Collections Erläutert die Verwendung von Übereinstimmungs- und Sortiervergleichen in Auflistungen.Discusses the use of equality comparisons and sorting comparisons in collections.
Sortierte AuflistungstypenSorted Collection Types Beschreibt die Leistung und die Merkmale von sortierten Auflistungen.Describes sorted collections performance and characteristics
Hashtable-Auflistungstyp und Dictionary-AuflistungstypHashtable and Dictionary Collection Types Beschreibt die Funktionen von generischen und nicht generischen hashbasierten Wörterbuchtypen.Describes the features of generic and non-generic hash-based dictionary types.
threadsichere AuflistungenThread-Safe Collections Beschreibt Auflistungstypen wie System.Collections.Concurrent.BlockingCollection<T> und System.Collections.Concurrent.ConcurrentBag<T>, die den sicheren und effizienten gleichzeitigen Zugriff von mehreren Threads unterstützen.Describes collection types such as System.Collections.Concurrent.BlockingCollection<T> and System.Collections.Concurrent.ConcurrentBag<T> that support safe and efficient concurrent access from multiple threads.
System.Collections.ImmutableSystem.Collections.Immutable Enthält einführende Informationen zu unveränderlichen Auflistungen und Links zu den Auflistungstypen.Introduces the immutable collections and provides links to the collection types.

VerweisReference

System.Array
System.Collections
System.Collections.Concurrent
System.Collections.Generic
System.Collections.Specialized
System.Linq
System.Collections.Immutable