Heim > Artikel > Backend-Entwicklung > Detaillierte Erläuterung des grafischen Codes von C#-Sammlungstypen
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 ICollection8742468051c85b06f0a0af9e3e506b5c und bietet nicht die Funktionen zum Bearbeiten von Sammlungen, nämlich Hinzufügen und Entfernen. Einschließlich der Prüfung, ob das Element „Contains“ vorhanden ist, wird nicht unterstützt.
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 IList8742468051c85b06f0a0af9e3e506b5c betrachtet werden, wobei alle Funktionen entfernt werden, die diese Sammlung ändern könnten. Zum Beispiel: Add, RemoveAt usw.
IDictionary bietet Zugriff auf eine Sammlung von Schlüssel-Wert-Paaren. Es erbt außerdem ICollection8742468051c85b06f0a0af9e3e506b5c und erweitert die Methode für den Zugriff auf und die Verarbeitung von Daten.
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örterbuch8c189faf63255a5ea96468ba21dd0564
SortedDictionary8c189faf63255a5ea96468ba21dd0564
SortedList8c189faf63255a5ea96468ba21dd0564
Dictionary8c189faf63255a5ea96468ba21dd0564 ist wahrscheinlich unsere am häufigsten verwendete assoziative Sammlung. Der Zugriff auf, das Hinzufügen und Löschen von Daten dauert am schnellsten, da Hashtable intern als Speicherstruktur verwendet wird Wie viele Schlüssel-Wert-Paare werden gespeichert, die zum Abfragen/Hinzufügen/Löschen benötigte Zeit ist gleich und die zeitliche Komplexität beträgt O(1).
Dictionary8c189faf63255a5ea96468ba21dd0564Der Vorteil besteht darin, dass es schnell gesucht und eingefügt werden kann. Was sind also seine Nachteile? Da Hashtable als Speicherstruktur verwendet wird, bedeutet dies, dass die darin enthaltenen Daten nicht in der richtigen Reihenfolge angeordnet sind, sodass es ein wenig Aufwand erfordert, die Daten in Dictionaryb6842da76bed01162354d37c4f2d3464 in einer bestimmten Reihenfolge zu durchlaufen.
Der Typ als TKey muss GetHashCode() und Equals() implementieren oder einen IEqualityComparer bereitstellen, ansonsten funktionieren Es können Probleme auftreten.
SortedDictionary8c189faf63255a5ea96468ba21dd0564 und Dictionary8c189faf63255a5ea96468ba21dd0564 sind in etwa ähnlich, es gibt jedoch einen kleinen Unterschied in der Implementierung. SortedDictionary8c189faf63255a5ea96468ba21dd0564 verwendet einen Binärbaum als Speicherstruktur. Und in der Schlüsselreihenfolge angeordnet. In diesem Fall muss der TKey von SortedDictionary8c189faf63255a5ea96468ba21dd0564 IComparable7c013bef549e108856916cfbe0707d60 implementieren. Wenn Sie schnell abfragen und die Sortierung gut unterstützen möchten, dann verwenden Sie 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.
LinkedList8742468051c85b06f0a0af9e3e506b5c
HashSet8742468051c85b06f0a0af9e3e506b5c
HashSet unterstützt keinen Indexzugriff.
SortedSet8742468051c85b06f0a0af9e3e506b5c
Stapel8742468051c85b06f0a0af9e3e506b5c
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 List8742468051c85b06f0a0af9e3e506b5c.
HashTable wurde später durch Dictionary8c189faf63255a5ea96468ba21dd0564 ersetzt.
Queue wurde später durch Queue8742468051c85b06f0a0af9e3e506b5c ersetzt.
SortedList wurde später durch SortedList8742468051c85b06f0a0af9e3e506b5c ersetzt.
Stack wurde später durch Stack8742468051c85b06f0a0af9e3e506b5c ersetzt.
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!