Sammlungen in C#
Sammlungen sind ein wichtiger Bestandteil der .NET FCL (Framework Class Library) und eine der am häufigsten verwendeten Funktionen in unserer Entwicklung. Sie sind fast überall. Wie das Sprichwort sagt: Wissen Sie, was es ist und warum es so ist. Wenn Sie IEnumerable, IEnumerator und ICollection sehen, kennen Sie dann die Unterschiede zwischen ihnen? Welche anderen Sammlungsklassen haben Sie neben List und Dictionary noch verwendet? Heute werfen wir ohne weiteres einen Blick auf einige der Schnittstellen, die Sammlungsklassen und ihre Implementierungen definieren.
Werfen wir zunächst einen Blick darauf, welche Schnittstellen uns FCL zur Verfügung stellt:
public interface IEnumerator { bool MoveNext(); object Current { get; } void Reset(); }
IEnumerator definiert die grundlegende Methode zum Durchlaufen der Sammlung, sodass wir einen unidirektionalen Vorwärtszugriff auf jedes Element in der Sammlung erreichen können. IEnumerable hat nur eine Methode, GetEnumerator, die der Traverser ist.
public interface IEnumerable { IEnumerator GetEnumerator(); }
Hinweis: Das von uns häufig verwendete foreach ist eine Art syntaktischer Zucker. Es ruft tatsächlich die von Current und MoveNext in Enumerator implementierte Traversalfunktion auf.
List<string> list = new List<string>() { "Jesse", "Chloe", "Lei", "Jim", "XiaoJun" }; // Iterate the list by using foreach foreach (var buddy in list) { Console.WriteLine(buddy); } // Iterate the list by using enumerator List<string>.Enumerator enumerator = list.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }
Das im obigen Code verwendete foreach und der Enumerator werden schließlich in MoveNext und Current des Enumerators in IL übersetzt.
IEnumerable ist eine sehr nützliche Schnittstelle. Zu den Vorteilen ihrer Implementierung gehören:
Unterstützen Sie jede Aussage
Interagieren Sie mit anderen Bibliotheken als Standard-Sammlungsklasse
Erfüllen Sie die Anforderungen komplexerer Sammlungsschnittstellen
Unterstützt den Sammlungsinitialisierer
Natürlich gibt es viele Möglichkeiten, dies zu erreichen, wie folgt:
Wenn unsere Sammlung durch Kapselung anderer Sammlungsklassen entsteht, können wir den Enumerator dieser Sammlung direkt zurückgeben
Verwenden Sie yield return, um
zurückzugeben Implementieren Sie unseren eigenen IEnumerator, um
zu implementieren Hier zeige ich Ihnen, wie Sie den Enumerator
public class BuddyList : IEnumerable { private string[] data= new string[] { "Jesse", "Chloe", "Lei", "Jim", "XiaoJun" }; public IEnumerator GetEnumerator() { foreach (var str in data) { yield return str; } } } var myBuddies= new BuddyList(); foreach (var str in myBuddies) { Console.WriteLine(str); }
Aus dem ersten Bild oben können wir erkennen, dass ICollection direkt von IEnumerable geerbt wird. Tatsächlich können wir auch sagen, dass ICollection mehr Funktionen als IEnumerable unterstützt und nicht nur grundlegende Durchlauffunktionen bereitstellt, sondern auch:
Zählen Sie die Anzahl der Sätze und Elemente
Holen Sie sich den Index des Elements
Bestimmen Sie, ob
Elemente am Ende hinzufügen
Elemente entfernen usw. . .
ICollection unterscheidet sich geringfügig von ICollection
IList erbt direkt von ICollection und IEnumerable. Es umfasst also die Funktionalität beider und unterstützt den Zugriff auf und das Hinzufügen von Elementen basierend auf Indizes. IndexOf, Insert, RemoveAt und so weiter. Wir können sagen, dass IEnumerable die wenigsten Funktionen unterstützt, nur Traversal. ICollection unterstützt etwas mehr Funktionen, darunter nicht nur das Durchlaufen, sondern auch das Verwalten der Sammlung. Und IList ist die vollständigste Version.
Dies ist ein neuer Schnittstellentyp in Framework 4.5. Er kann als verkürzte Version von IList
IDictionary bietet Zugriff auf eine Sammlung von Schlüssel-Wert-Paaren. Es erbt außerdem ICollection
Die assoziative Sammlungsklasse ist das, was wir oft als Schlüssel-Wert-Paar-Sammlung bezeichnen, sodass wir über Key auf die Sammlung zugreifen und diese verwalten können. Schauen wir uns zunächst an, welche generischen assoziativen Sammlungsklassen FCL uns zur Verfügung stellt:
Wörterbuch
SortedDictionary
SortedList
Dictionary
Dictionary
Der Typ als TKey muss GetHashCode() und Equals() implementieren oder einen IEqualityComparer bereitstellen, ansonsten funktionieren Es können Probleme auftreten.
SortedDictionary
Nicht-assoziative generische Sammlungsklasse
Da das interne Wesen ein Array ist, ist das Hinzufügen von Daten zur Liste möglicherweise nicht schneller, aber das Hinzufügen oder Löschen von Daten am Anfang oder in der Mitte der Daten ist relativ weniger effizient, da es die Neuanordnung anderer Daten beeinflusst.
LinkedList
HashSet
HashSet unterstützt keinen Indexzugriff.
SortedSet
Stapel
First-in-First-out-Warteschlange
Der Zugriff auf
Versammeln |
In der richtigen Reihenfolge anordnen |
Lianshun-Lagerung |
Direktzugriffsmethode |
Besuchszeit |
Betriebszeit |
Bemerkungen |
Wörterbuch |
|
Ja |
Schlüssel |
Schlüssel: O(1)
|
O(1) |
Die schnellste Zugriffsleistung und unterstützt keine Sortierung |
SortedDictionary |
In der richtigen Reihenfolge anordnen |
Nein |
Schlüssel |
Schlüssel: |
O(log n) |
Ein Kompromiss zwischen schnellem Zugriff und Sortierunterstützung |
SortedList |
In der richtigen Reihenfolge anordnen |
Ja |
Schlüssel |
Schlüssel: O(log n)
|
O(n) |
Ähnlich wie SortedDictionary, außer dass Daten intern anstelle von Baum als Speicherstruktur verwendet werden. |
Liste |
Benutzer können die Position von Elementen präzise steuern |
Ja |
Index |
Index: O(1) Wert: O(n)
|
O(n) |
Am besten geeignet für kleine Sammlungen, die direkten Zugriff auf jedes Element erfordern. |
LinkedList |
Benutzer können die Position von Elementen präzise steuern |
Nein |
Nicht unterstützt |
Wert: O(n)
|
O(1) |
Am besten geeignet für Szenarien, in denen kein direkter Zugriff auf einzelne Elemente erforderlich ist, aber sehr häufige Ergänzungen/Entfernungen zur Sammlung erforderlich sind. |
HashSet |
Nicht unterstützt |
Ja |
Schlüssel |
Schlüssel: O(1)
|
O(1) |
Eine Kollektion, die die Einzigartigkeit der Elemente bewahrt. Sortieren wird nicht unterstützt |
SortedSet |
In der richtigen Reihenfolge anordnen |
Nein |
Schlüssel |
Schlüssel: O(log n)
|
O(log n) |
Kann die Einzigartigkeit von Elementen aufrechterhalten und die Sortierung unterstützen. |
Stapel |
LIFO |
Ja |
Es kann nur das oberste Element erhalten werden |
Oben: O(1) |
O(1) |
|
Warteschlange |
FIFO |
Ja |
Es kann nur das unterste Element erhalten werden |
Vorderseite: O(1) |
O(1) |
|
Die generische Sammlungsklasse kam in .NET 2.0 heraus, was bedeutet, dass es in .NET 1.0 keine so praktische Funktion gab. Im Grunde verwenden wir diese Sammlungsklassen nicht mehr, außer wenn wir daran arbeiten, die Kompatibilität mit altem Code aufrechtzuerhalten. Werfen wir einen Blick darauf, welche Sammlungsklassen von .NET-Programmierern in der 1.0-Ära verwendet werden können.
ArraryList
Später ersetzt durch List
HashTable wurde später durch Dictionary
Queue wurde später durch Queue
SortedList wurde später durch SortedList
Stack wurde später durch Stack
ConcurrentQueue-Thread-sichere Version von Queue
ConcurrentStack-Thread-sichere Version von Stack
ConcurrentBag-Thread-sichere Sammlung von Objekten
ConcurrentDictionary Thread-sicheres Wörterbuch
BlockingCollection
Die von .NET bereitgestellten Sammlungsklassen sind eine unserer am häufigsten verwendeten Werkzeugklassen. Ich hoffe, dieser Artikel kann jedem helfen, diese Sammlungsklassen besser zu verstehen. Natürlich habe ich persönlich das Gefühl, dass es immer noch Unvollkommenheiten gibt. Beispielsweise werden HashTable und Binary Search Tree nicht im Detail untersucht, und der Vergleich zwischen einseitig verknüpften Listen und doppelt verknüpften Listen wird in diesem Artikel nicht erwähnt. Interessierte Freunde können mehr darüber erfahren.
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des grafischen Codes von C#-Sammlungstypen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!