Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article pas à pas vous montre comment implémenter une collection personnalisée en 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 du produit d’origine : Visual C#
Numéro de 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 .CountSyncRoot 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
System.Collectionde 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
CustomCollectionclasse contient un tableau avec trois éléments entiers et une variable de nombre.Implémentez la
CopyTométhode, qui prend un tableau entier et un index en tant que paramètres. Cette méthode copie les éléments d’une collection dans le tableau 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
GetEnumeratorméthode, qui est héritée par l’interfaceICollectiondeIEnumerable. LaGetEnumeratorméthode retourne unEnumeratorobjet qui peut itérer au sein d’une collection. Collez l’exemple de code suivant après laCopyTomé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
GetEnumeratormé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 à travers CustomCollection.
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
intArrtableau entier privé pour contenir les éléments de laCustomCollectionclasse lorsque laGetEnumeratorméthode est appelée. LeCursormembre de champ conserve la position actuelle lors de l’énumération.Ajoutez un constructeur avec
intArren tant que paramètre et définissez le localintArrsur ce paramètre. 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 méthodes
ResetetMoveNext. 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)); }Resetdéfinit laCursorvaleur -1 etMoveNextdéplace l’élémentCursorvers l’élément suivant.MoveNextretourne True si elle réussit.Implémentez la
Currentpropriété en lecture seule qui renvoie l’élément pointé par leCursor. Si laCursorvaleur est -1, elle génère unInvalidOperationException. Collez le code suivant après laMoveNextméthode :object IEnumerator.Current { get { if((Cursor < 0) || (Cursor == intArr.Length)) throw new InvalidOperationException(); return intArr[Cursor]; } }
Utilisation de chacune d’elles pour itérer dans 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
Clickdu 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.
Note
Une boîte de message affiche les éléments de la collection personnalisée.
Comment cela fonctionne ? Pour chaque appel de la GetEnumerator méthode pour créer l’objet Enumerator et appelle la MoveNext méthode pour définir le Cursor 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.