Collections en C#
Les collections sont une partie importante de .NET FCL (Framework Class Library) et l'une des fonctions les plus couramment utilisées dans notre développement. Elles sont presque partout. Comme le dit le proverbe, sachez ce que c'est et pourquoi. Lorsque vous voyez IEnumerable, IEnumerator et ICollection, connaissez-vous les différences entre eux ? En plus de List et Dictionary, quelles autres classes de collection avez-vous utilisées ? Sans plus tarder, nous examinerons aujourd'hui certaines des interfaces qui définissent les classes de collection et leurs implémentations.
Jetons d'abord un coup d'œil aux interfaces que FCL nous propose :
public interface IEnumerator { bool MoveNext(); object Current { get; } void Reset(); }
IEnumerator définit la méthode de base qui nous permet de parcourir la collection afin que nous puissions obtenir un accès unidirectionnel à chaque élément de la collection. IEnumerable n'a qu'une seule méthode, GetEnumerator, qui est le traverseur.
public interface IEnumerable { IEnumerator GetEnumerator(); }
Remarque : Le foreach que nous utilisons souvent est une sorte de sucre syntaxique. Il appelle en fait la fonction de traversée implémentée par Current et MoveNext dans Enumerator.
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); }
Le foreach et l'énumérateur utilisés dans le code ci-dessus seront éventuellement traduits en MoveNext et Current in IL de l'énumérateur.
IEnumerable est une interface très utile. Les avantages de sa mise en œuvre incluent :
. Prise en charge de chaque déclaration
Interagissez avec d'autres bibliothèques en tant que classe de collection standard
Répondre aux besoins des interfaces de collecte plus complexes
Initialiseur de collecte de support
Bien entendu, il existe de nombreuses façons d'y parvenir, comme suit :
Si notre collection vient en encapsulant d'autres classes de collection, alors nous pouvons renvoyer directement l'énumérateur de cette collection
Utilisez le retour de rendement pour revenir
Implémentez notre propre IEnumerator pour implémenter
Ici, je vais vous montrer comment renvoyer l'enquêteur
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); }
Dès la première image en haut, nous pouvons savoir qu'ICollection est directement héritée de IEnumerable. En fait, c'est également le cas. Nous pouvons dire qu'ICollection prend en charge plus de fonctions que IEnumerable, fournissant non seulement des fonctions de traversée de base, mais incluant également :
. Comptez le nombre d'ensembles et d'éléments
Récupérer l'indice de l'élément
Déterminer si
Ajouter des éléments à la fin
Supprimez des éléments et ainsi de suite. . .
ICollection est légèrement différent de ICollection
IList hérite directement de ICollection et IEnumerable. Il inclut donc les fonctionnalités des deux et prend en charge l'accès et l'ajout d'éléments basés sur des indices. IndexOf, Insert, RemoveAt et ainsi de suite. On peut dire que IEnumerable prend en charge le moins de fonctions, uniquement le parcours. ICollection prend en charge un peu plus de fonctions, notamment le parcours mais également la maintenance de la collection. Et IList est la version la plus complète.
Il s'agit d'un nouveau type d'interface dans Framework 4.5. Il peut être considéré comme une version abrégée de IList
IDictionary donne accès à une collection de paires clé-valeur. Il hérite également de ICollection
La classe de collection associative est ce que nous appelons souvent une collection de paires clé-valeur, nous permettant d'accéder et de maintenir la collection via Key. Jetons d'abord un coup d'œil à ce que les classes de collection associatives génériques FCL nous proposent :
Dictionnaire
SortedDictionary
SortedList
Dictionary
Dictionnaire
Le type comme TKey doit implémenter GetHashCode() et Equals() ou fournir un IEqualityComparer, sinon fonctionner Des problèmes peuvent survenir.
SortedDictionary
Classe de collection générique non associative
De plus, comme l'essence interne est un tableau, l'ajout de données à la liste n'est peut-être pas plus rapide, mais l'ajout ou la suppression de données en tête ou au milieu des données est relativement moins efficace car cela affectera le réarrangement d'autres données.
LinkedList
HashSet
HashSet ne prend pas en charge l'accès aux indices.
SortedSet
Pile
File d'attente premier entré, premier sorti
Ne prend pas en charge l'accès à
Rassembler |
Organiser dans l'ordre |
Stockage Lianshun |
Méthode d'accès direct |
Heure de la visite |
Temps de fonctionnement |
Remarques |
Dictionnaire |
|
Oui |
Clé |
Clé : O(1)
|
O(1) |
Les performances d'accès les plus rapides et ne prennent pas en charge le tri |
TriéDictionnaire |
Organiser dans l'ordre |
Non |
Clé |
Clé : |
O(log n) |
Un compromis entre accès rapide et prise en charge du tri |
Liste triée |
Organiser dans l'ordre |
Oui |
Clé |
Clé : O(log n)
|
O(n) |
Semblable à SortedDictionary, sauf que les données sont utilisées en interne au lieu de l'arborescence comme structure de stockage. |
Liste |
Les utilisateurs peuvent contrôler avec précision la position des éléments |
Oui |
Indice |
Indice : O(1) Valeur : O(n)
|
O(n) |
Idéal pour les petites collections qui nécessitent un accès direct à chaque élément. |
Liste liée |
Les utilisateurs peuvent contrôler avec précision la position des éléments |
Non |
Non pris en charge |
Valeur : O(n)
|
O(1) |
Idéal pour les scénarios dans lesquels un accès direct à des éléments individuels n’est pas requis, mais des ajouts/suppressions très fréquents à la collection sont nécessaires. |
HashSet |
Non pris en charge |
Oui |
Clé |
Clé : O(1)
|
O(1) |
Une collection qui préserve le caractère unique des éléments. Le tri n'est pas pris en charge |
Ensemble trié |
Organiser dans l'ordre |
Non |
Clé |
Clé : O(log n)
|
O(log n) |
Peut conserver l’unicité des éléments et prendre en charge le tri. |
Pile |
LIFO |
Oui |
Seul l'élément supérieur peut être obtenu |
Haut : O(1) |
O(1) |
|
File d'attente |
FIFO |
Oui |
Seul l'élément du bas peut être obtenu |
Recto : O(1) |
O(1) |
|
La classe de collection générique est sortie dans .NET 2.0, ce qui signifie qu'il n'y avait rien de aussi pratique dans .NET 1.0. Désormais, fondamentalement, nous n'utilisons plus ces classes de collection, sauf lorsque nous effectuons des travaux pour maintenir la compatibilité avec l'ancien code. Jetons un coup d'œil aux classes de collection qui peuvent être utilisées par les programmeurs .NET à l'ère 1.0.
ArraryList
Remplacé plus tard par List
HashTable a ensuite été remplacé par Dictionary
La file d'attente a ensuite été remplacée par Queue
SortedList a ensuite été remplacé par SortedList
Stack a ensuite été remplacé par Stack
ConcurrentQueue version thread-safe de Queue
Version thread-safe ConcurrentStack de Stack
Collection d'objets thread-safe ConcurrentBag
Dictionnaire thread-safe ConcurrentDictionary
BlocageCollection
Les classes de collection fournies par .NET sont l'une de nos classes d'outils les plus couramment utilisées. J'espère que cet article pourra aider tout le monde à mieux comprendre ces classes de collection. Bien sûr, je pense personnellement qu'il y a encore des imperfections. Par exemple, HashTable et Binary Search Tree ne sont pas étudiés en détail, et la comparaison entre les listes chaînées unidirectionnelles et les listes doublement chaînées n'est pas mentionnée dans cet article. Les amis intéressés peuvent en apprendre davantage.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!