Utiliser Visual C# pour implémenter des collections personnalisées
Cet article pas à pas vous montre comment implémenter une collection personnalisée dans Visual C#. Les bibliothèques de classes de base Microsoft .NET Framework offrent une définition formelle d’une interface de collection System.Collections.ICollection
.
Version d’origine du produit : Visual C#
Numéro de la base de connaissances d’origine : 307484
Implémenter l’interface ICollection dans une classe personnalisée
L’interface ICollection
hérite de l’interface IEnumerable
. L’interface ICollection
définit une CopyTo
méthode et trois propriétés en lecture seule : IsSynchronized
, et .Count
SyncRoot
ICollection
hérite de la GetEnumerator
méthode de l’interface IEnumerable
. Une classe de collection personnalisée doit implémenter l’interface ICollection
.
Pour implémenter l’interface ICollection
, procédez comme suit :
Dans Visual C# .NET, créez une application Windows.
Dans Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, pointez sur Ajouter, puis cliquez sur Ajouter une classe pour ajouter un module de classe nommé CustomCollection.
Ajoutez l’exemple de code suivant au début du module de classe pour importer l’espace de
System.Collection
noms :using System.Collections;
Remplacez tout autre code du module par l’exemple de code suivant :
public class CustomCollection : ICollection { private int[] intArr = {1,5,9}; private int Ct; public CustomCollection() { Ct=3; } }
Par souci de simplicité, la
CustomCollection
classe contient un tableau avec trois éléments entiers et une variable count.Implémentez la
CopyTo
méthode , qui prend un tableau d’entiers et un index en tant que paramètres. Cette méthode copie les éléments d’une collection dans le tableau en commençant à l’index passé. Pour implémenter cette méthode, collez le code suivant après le constructeur publicCustomCollection
:void ICollection.CopyTo(Array myArr, int index) { foreach (int i in intArr) { myArr.SetValue(i,index); index = index+1; } }
Implémentez la
GetEnumerator
méthode , qui est héritée par l’interfaceICollection
deIEnumerable
. LaGetEnumerator
méthode retourne unEnumerator
objet qui peut itérer au sein d’une collection. Collez l’exemple de code suivant après laCopyTo
méthode :IEnumerator IEnumerable.GetEnumerator() { return new Enumerator(intArr); }
Pour implémenter les trois propriétés en lecture seule, collez le code suivant après la
GetEnumerator
méthode :// The IsSynchronized Boolean property returns True if the // collection is designed to be thread safe; otherwise, it returns False. bool ICollection.IsSynchronized { get { return false; } } // The SyncRoot property returns an object, which is used for synchronizing // the collection. This returns the instance of the object or returns the // SyncRoot of other collections if the collection contains other collections. object ICollection.SyncRoot { get { return this; } } // The Count read-only property returns the number // of items in the collection. int ICollection.Count { get { return Ct; } }
Implémenter un objet Enumerator pour la méthode GetEnumerator
Cette section vous montre comment créer une Enumerator
classe qui peut itérer au sein CustomCollection
de .
Collez l’exemple de code suivant après l’instruction de classe de fin dans votre module de classe :
public class Enumerator : IEnumerator { private int[] intArr; private int Cursor; }
Déclarez le
intArr
tableau d’entiers privés pour contenir les éléments de laCustomCollection
classe lorsque laGetEnumerator
méthode est appelée. LeCursor
membre de champ conserve la position actuelle lors de l’énumération.Ajoutez un constructeur avec
intArr
comme paramètre et définissez le localintArr
sur ceci. Collez l’exemple de code suivant après la déclaration du champ membre :public Enumerator(int[] intarr) { this.intArr = intarr; Cursor = -1; }
Implémentez les
Reset
méthodes etMoveNext
. Pour ce faire, collez le code suivant après le constructeur :void IEnumerator.Reset() { Cursor = -1; } bool IEnumerator.MoveNext() { if (Cursor < intArr.Length) Cursor++; return(!(Cursor == intArr.Length)); }
Reset
définit laCursor
valeur -1 etMoveNext
déplace leCursor
vers l’élément suivant.MoveNext
retourne La valeur True en cas de réussite.Implémentez la
Current
propriété en lecture seule qui retourne l’élément pointé par .Cursor
Si a laCursor
valeur -1, il génère unInvalidOperationException
. Collez le code suivant après laMoveNext
méthode :object IEnumerator.Current { get { if((Cursor < 0) || (Cursor == intArr.Length)) throw new InvalidOperationException(); return intArr[Cursor]; } }
Utilisation de pour chaque pour itérer au sein de la collection personnalisée
Dans Form1.cs, sous l’onglet Création , faites glisser un bouton vers le formulaire.
Double-cliquez sur le bouton et ajoutez l’exemple de code suivant à l’événement
Click
du bouton :CustomCollection MyCol = new CustomCollection(); foreach (object MyObj in MyCol) MessageBox.Show(MyObj.ToString());
Appuyez sur F5 pour exécuter l’application, puis cliquez sur le bouton .
Remarque
Une boîte de message affiche les éléments de la collection personnalisée.
Comment cela fonctionne-t-il ? Pour chaque appelle la GetEnumerator
méthode pour créer l’objet Enumerator
et appelle la MoveNext
méthode pour définir le Cursor
sur le premier élément. Ensuite, la propriété actuelle est accessible pour obtenir l’élément dans MyObj
. Cette opération est répétée jusqu’à ce que MoveNext
retourne False.
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour