Язык программирования C#9 и платформа .NET5. Страница 175
using System.Collections;namespace CustomEnumerator{ // Garage содержит набор объектов Car. public class Garage { private Car[] carArray = new Car[4]; // При запуске заполнить несколькими объектами Car. public Garage() { carArray[0] = new Car("Rusty", 30); carArray[1] = new Car("Clunker", 55); carArray[2] = new Car("Zippy", 30); carArray[3] = new Car("Fred", 30); } }}В идеальном случае было бы удобно проходить по внутренним элементам объекта
Garageforeachusing System;using CustomEnumerator;// Код выглядит корректным...Console.WriteLine("***** Fun with IEnumerable / IEnumerator *****\n");Garage carLot = new Garage();// Проход по всем объектам Car в коллекции?foreach (Car c in carLot){ Console.WriteLine("{0} is going {1} MPH", c.PetName, c.CurrentSpeed);}Console.ReadLine();К сожалению, компилятор информирует о том, что в классе Garage не реализован метод по имени
GetEnumerator()IEnumerableSystem.CollectionsНа заметку! В главе 10 вы узнаете о роли обобщений и о пространстве имен
System.Collections.GenericIEnumerable/IEnumeratorКлассы или структуры, которые поддерживают такое поведение, позиционируются как способные предоставлять вызывающему коду доступ к элементам, содержащимся внутри них (в рассматриваемом примере самому ключевому слову
foreach// Данный интерфейс информирует вызывающий код о том,// что элементы объекта могут перечислятьсяpublic interface IEnumerable{ IEnumerator GetEnumerator();}Как видите, метод
GetEnumerator()System.Collections.IEnumeratorIEnumerable// Этот интерфейс позволяет вызывающему коду получать элементы контейнера.public interface IEnumerator{ bool MoveNext (); // Переместить вперед внутреннюю позицию курсора. object Current { get;} // Получить текущий элемент // (свойство только для чтения). void Reset (); // Сбросить курсор в позицию перед первым элементом.}Если вы хотите обновить тип
GarageGetEnumerator()MoveNext()CurrentReset()System.ArrayIEnumerableIEnumeratorSystem.ArraySystem.Collectionsusing System.Collections;...public class Garage : IEnumerable { // System.Array уже реализует IEnumerator! private Car[] carArray = new Car[4]; public Garage() { carArray[0] = new Car("FeeFee", 200); carArray[1] = new Car("Clunker", 90); carArray[2] = new Car("Zippy", 30); carArray[3] = new Car("Fred", 30); } // Возвратить IEnumerator объекта массива. public IEnumerator GetEnumerator() => carArray.GetEnumerator(); } После такого изменения тип
GarageforeachGetEnumerator()IEnumerator
Перейти на страницу:
Изменить размер шрифта: