Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 175
- Предыдущая
- 175/642
- Следующая
Изменить размер шрифта:
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);
}
}
}
В идеальном случае было бы удобно проходить по внутренним элементам объекта
Garage
foreach
using 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()
IEnumerable
System.Collections
На заметку! В главе 10 вы узнаете о роли обобщений и о пространстве имен
System.Collections.Generic
IEnumerable/IEnumerator
Классы или структуры, которые поддерживают такое поведение, позиционируются как способные предоставлять вызывающему коду доступ к элементам, содержащимся внутри них (в рассматриваемом примере самому ключевому слову
foreach
// Данный интерфейс информирует вызывающий код о том,
// что элементы объекта могут перечисляться
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
Как видите, метод
GetEnumerator()
System.Collections.IEnumerator
IEnumerable
// Этот интерфейс позволяет вызывающему коду получать элементы контейнера.
public interface IEnumerator
{
bool MoveNext (); // Переместить вперед внутреннюю позицию курсора.
object Current { get;} // Получить текущий элемент
// (свойство только для чтения).
void Reset (); // Сбросить курсор в позицию перед первым элементом.
}
Если вы хотите обновить тип
Garage
GetEnumerator()
MoveNext()
Current
Reset()
System.Array
IEnumerable
IEnumerator
System.Array
System.Collections
using 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();
}
После такого изменения тип
Garage
foreach
GetEnumerator()
IEnumerator
175
- Предыдущая
- 175/642
- Следующая
Перейти на страницу: