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 .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 :

  1. Dans Visual C# .NET, créez une application Windows.

  2. 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.

  3. Ajoutez l’exemple de code suivant au début du module de classe pour importer l’espace de System.Collection noms :

    using System.Collections;
    
  4. 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.

  5. 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 public CustomCollection :

    void ICollection.CopyTo(Array myArr, int index)
    {
        foreach (int i in intArr)
        {
            myArr.SetValue(i,index);
            index = index+1;
        }
    }
    
  6. Implémentez la GetEnumerator méthode , qui est héritée par l’interface ICollection de IEnumerable. La GetEnumerator méthode retourne un Enumerator objet qui peut itérer au sein d’une collection. Collez l’exemple de code suivant après la CopyTo méthode :

    IEnumerator IEnumerable.GetEnumerator()
    {
        return new Enumerator(intArr);
    }
    
  7. 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 CustomCollectionde .

  1. 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 la CustomCollection classe lorsque la GetEnumerator méthode est appelée. Le Cursor membre de champ conserve la position actuelle lors de l’énumération.

  2. Ajoutez un constructeur avec intArr comme paramètre et définissez le local intArr 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;
    }
    
  3. Implémentez les Reset méthodes et MoveNext . 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 la Cursor valeur -1 et MoveNext déplace le Cursor vers l’élément suivant. MoveNext retourne La valeur True en cas de réussite.

  4. Implémentez la Current propriété en lecture seule qui retourne l’élément pointé par .Cursor Si a la Cursor valeur -1, il génère un InvalidOperationException. Collez le code suivant après la MoveNext 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

  1. Dans Form1.cs, sous l’onglet Création , faites glisser un bouton vers le formulaire.

  2. 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());
    
  3. 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.