Использование 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
интерфейс, выполните следующие действия.
В 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
класс содержит массив с тремя целочисленными элементами и переменной count.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
.
Вставьте следующий пример кода после оператора end class в модуль класса:
public class Enumerator : IEnumerator { private int[] intArr; private int Cursor; }
Объявите частный
intArr
целочисленный массив для хранения элементовCustomCollection
класса при вызовеGetEnumerator
метода . ЭлементCursor
поля сохраняет текущую позицию при перечислении.Добавьте конструктор с
intArr
в качестве параметра и присвойте этому параметру значение localintArr
. Вставьте следующий пример кода после объявления поля-члена: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)); }
Reset
задает значениеCursor
-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.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по