Использование Visual C# для реализации пользовательских коллекций

В этой пошаговой статье показано, как реализовать настраиваемую коллекцию в Visual C#. Библиотеки базовых классов Microsoft платформа .NET Framework предлагают формальное определение интерфейса коллекцииSystem.Collections.ICollection.

Исходная версия продукта: Visual C#
Исходный номер базы знаний: 307484

Реализация интерфейса ICollection в пользовательском классе

Интерфейс ICollection наследуется от IEnumerable интерфейса. Интерфейс ICollection определяет CopyTo метод и три свойства, доступные только для чтения: IsSynchronized, SyncRootи Count. ICollection наследует GetEnumerator метод из IEnumerable интерфейса. Пользовательский класс коллекции должен реализовывать ICollection интерфейс .

Чтобы реализовать ICollection интерфейс, выполните следующие действия.

  1. В Visual C# .NET создайте приложение Для Windows.

  2. В Обозреватель решений щелкните правой кнопкой мыши имя проекта, наведите указатель мыши на пункт Добавить, а затем выберите Добавить класс, чтобы добавить модуль класса с именем CustomCollection.

  3. Добавьте следующий пример кода в начало модуля класса, чтобы импортировать System.Collection пространство имен:

    using System.Collections;
    
  4. Замените любой другой код в модуле следующим примером кода:

    public class CustomCollection : ICollection
    {
        private int[] intArr = {1,5,9};
        private int Ct;
    
        public CustomCollection()
        {
            Ct=3;
        }
    }
    

    Для простоты CustomCollection класс содержит массив с тремя целочисленными элементами и переменной count.

  5. CopyTo Реализуйте метод , который принимает в качестве параметров целочисленный массив и индекс. Этот метод копирует элементы из коллекции в массив, начиная с передаваемого индекса. Чтобы реализовать этот метод, вставьте следующий код после открытого CustomCollection конструктора:

    void ICollection.CopyTo(Array myArr, int index)
    {
        foreach (int i in intArr)
        {
            myArr.SetValue(i,index);
            index = index+1;
        }
    }
    
  6. GetEnumerator Реализуйте метод , который наследуется интерфейсом ICollection от IEnumerable. Метод GetEnumerator возвращает Enumerator объект, который может выполнять итерацию по коллекции. Вставьте следующий пример кода после CopyTo метода :

    IEnumerator IEnumerable.GetEnumerator()
    {
        return new Enumerator(intArr);
    }
    
  7. Чтобы реализовать три свойства, доступные только для чтения, вставьте следующий код после GetEnumerator метода :

    // 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;
        }
    }
    

Реализация объекта перечислителя для метода GetEnumerator

В этом разделе показано, как создать Enumerator класс, который может выполнять итерацию через CustomCollection.

  1. Вставьте следующий пример кода после оператора end class в модуль класса:

    public class Enumerator : IEnumerator
    {
        private int[] intArr;
        private int Cursor;
    }
    

    Объявите частный intArr целочисленный массив для хранения элементов CustomCollection класса при вызове GetEnumerator метода . Элемент Cursor поля сохраняет текущую позицию при перечислении.

  2. Добавьте конструктор с intArr в качестве параметра и присвойте этому параметру значение local intArr . Вставьте следующий пример кода после объявления поля-члена:

    public Enumerator(int[] intarr)
    {
        this.intArr = intarr;
        Cursor = -1;
    }
    
  3. Реализуйте методы Reset и MoveNext . Для этого вставьте следующий код после конструктора:

    void IEnumerator.Reset()
    {
        Cursor = -1;
    }
    bool IEnumerator.MoveNext()
    {
        if (Cursor < intArr.Length)
            Cursor++;
    
        return(!(Cursor == intArr.Length));
    }
    

    Reset задает значение Cursor-1 и MoveNext перемещает в Cursor следующий элемент. MoveNext возвращает значение True в случае успешного выполнения.

  4. Current Реализуйте свойство только для чтения, которое возвращает элемент, на который указывает Cursor. Cursor Если имеет значение -1, он создает .InvalidOperationException Вставьте следующий код после MoveNext метода :

    object IEnumerator.Current
    {
        get
        {
            if((Cursor < 0) || (Cursor == intArr.Length))
                throw new InvalidOperationException();
            return intArr[Cursor];
        }
    }
    

Использование для каждого из них для итерации пользовательской коллекции

  1. В Form1.cs на вкладке Конструктор перетащите кнопку в форму.

  2. Дважды щелкните кнопку и добавьте следующий пример кода в Click событие кнопки:

    CustomCollection MyCol = new CustomCollection();
    
    foreach (object MyObj in MyCol)
        MessageBox.Show(MyObj.ToString());
    
  3. Нажмите клавишу F5, чтобы запустить приложение, а затем нажмите кнопку .

    Примечание.

    В окне сообщения отображаются элементы в пользовательской коллекции.

Как это работает? Для каждого вызывается GetEnumerator метод для создания Enumerator объекта и метод , MoveNext который задает Cursor для первого элемента. Затем осуществляется доступ к текущему свойству, чтобы получить элемент в MyObj. Это повторяется до тех пор, пока не MoveNext будет возвращено значение False.