Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой пошаговой статье показано, как реализовать пользовательскую коллекцию в Visual C#. Библиотеки базовых классов Microsoft платформа .NET Framework предлагают формальное определение интерфейса коллекцииSystem.Collections.ICollection.
Исходная версия продукта: Visual C#
Исходный номер базы знаний: 307484
Реализация интерфейса ICollection в пользовательском классе
Интерфейс ICollection наследует от интерфейса IEnumerable . Интерфейс ICollection определяет метод и три свойства, доступные CopyTo только для чтения: IsSynchronized, SyncRootи Count. ICollection наследует GetEnumerator метод из IEnumerable интерфейса. Класс пользовательской ICollection коллекции должен реализовать интерфейс.
Чтобы реализовать ICollection интерфейс, выполните следующие действия.
В Visual C# .NET создайте приложение Windows.
В Обозреватель решений щелкните правой кнопкой мыши имя проекта, наведите указатель мыши на "Добавить", а затем нажмите кнопку "Добавить класс", чтобы добавить модуль класса с именем CustomCollection.
Добавьте следующий пример кода в начало модуля класса для импорта
System.Collectionпространства имен:using System.Collections;Замените любой другой код в модуле следующим примером кода:
public class CustomCollection : ICollection { private int[] intArr = {1,5,9}; private int Ct; public CustomCollection() { Ct=3; } }Для простоты
CustomCollectionкласс содержит массив с тремя целыми элементами и переменной счетчика.CopyToРеализуйте метод, который принимает целый массив и индекс в качестве параметров. Этот метод копирует элементы в коллекцию в массив, начиная с переданного индекса. Чтобы реализовать этот метод, вставьте следующий код после общедоступногоCustomCollectionконструктора:void ICollection.CopyTo(Array myArr, int index) { foreach (int i in intArr) { myArr.SetValue(i,index); index = index+1; } }GetEnumeratorРеализуйте метод, наследуемый интерфейсомICollection.IEnumerableМетодGetEnumeratorвозвращаетEnumeratorобъект, который может выполнять итерацию через коллекцию. Вставьте следующий пример кода послеCopyToметода:IEnumerator IEnumerable.GetEnumerator() { return new Enumerator(intArr); }Чтобы реализовать три свойства только для чтения, вставьте следующий код после
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.
Вставьте следующий пример кода после инструкции конечного класса в модуле класса:
public class Enumerator : IEnumerator { private int[] intArr; private int Cursor; }Объявите частный
intArrцелый массив для хранения элементовCustomCollectionкласса при вызовеGetEnumeratorметода. ЭлементCursorполя содержит текущую позицию при перечислении.Добавьте конструктор в
intArrкачестве параметра и задайте для этого локальноеintArrзначение. Вставьте следующий пример кода после объявления поля члена:public Enumerator(int[] intarr) { this.intArr = intarr; Cursor = -1; }Реализуйте методы
ResetиMoveNext. Для этого вставьте следующий код после конструктора:void IEnumerator.Reset() { Cursor = -1; } bool IEnumerator.MoveNext() { if (Cursor < intArr.Length) Cursor++; return(!(Cursor == intArr.Length)); }ResetCursorзадает значение -1 иMoveNextперемещает егоCursorк следующему элементу.MoveNextВозвращает значение True в случае успешного выполнения.CurrentРеализуйте свойство только для чтения, возвращающее элемент, на который указывает элементCursor. Если значениеCursorравно -1, оно создаетInvalidOperationExceptionобъект . Вставьте следующий код послеMoveNextметода:object IEnumerator.Current { get { if((Cursor < 0) || (Cursor == intArr.Length)) throw new InvalidOperationException(); return intArr[Cursor]; } }
Использование для каждого из них для итерации через пользовательскую коллекцию
В Form1.cs на вкладке "Конструктор " перетащите кнопку в форму.
Дважды щелкните кнопку и добавьте следующий пример кода в
Clickсобытие кнопки:CustomCollection MyCol = new CustomCollection(); foreach (object MyObj in MyCol) MessageBox.Show(MyObj.ToString());Нажмите клавишу F5, чтобы запустить приложение, а затем нажмите кнопку.
Примечание.
В окне сообщения отображаются элементы в пользовательской коллекции.
Как это работает? Для каждого вызова GetEnumerator метода для создания Enumerator объекта и вызывается MoveNext метод для задания Cursor первого элемента. Затем текущее свойство получает доступ к элементу MyObj. Это повторяется, пока не MoveNext возвращает значение False.