Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Топ:
Определение места расположения распределительного центра: Фирма реализует продукцию на рынках сбыта и имеет постоянных поставщиков в разных регионах. Увеличение объема продаж...
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Техника безопасности при работе на пароконвектомате: К обслуживанию пароконвектомата допускаются лица, прошедшие технический минимум по эксплуатации оборудования...
Интересное:
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Дисциплины:
|
из
5.00
|
Заказать работу |
Содержание книги
Поиск на нашем сайте
|
|
|
|
Оператор foreach является удобным средством перебора элементов объекта. Массивы и все стандартные коллекции библиотеки.NET позволяют выполнять такой перебор благодаря тому, что в них реализованы интерфейсы IEnumerable и IEnumerator. Для применения оператора foreach к пользовательскому типу данных требуется реализовать в нем эти интерфейсы.
Интерфейс IEnumerable (перечислимый) определяет всего один метод — GetEnumerator, возвращающий объект типа IEnumerator (перечислитель), который можно использовать для просмотра элементов объекта.
Интерфейс IEnumerator задает три элемента:
· свойство Current, возвращающее текущий элемент объекта;
· метод MoveNext, продвигающий перечислитель на следующий элемент объекта;
· метод Reset, устанавливающий перечислитель в начало просмотра.
Цикл foreach использует эти методы для перебора элементов, из которых состоит объект.
Таким образом, если требуется, чтобы для перебора элементов класса мог применяться цикл foreach, необходимо реализовать четыре метода: GetEnumerator, Current, MoveNext и Reset..
Итератор представляет собой блок кода, задающий последовательность перебора элементов объекта. На каждом проходе цикла foreach выполняется один шаг итератора, заканчивающийся выдачей очередного значения. Выдача значения выполняется с помощью ключевого слова yield.
Рассмотрим создание итератора на примере (листинг 5). Пусть требуется создать объект, содержащий боевую группу экземпляров типа Monster.
using System;
using System.Collections;
namespace ConsoleApplication1
{
class Monster {... }
class Daemon {... }
class Stado: IEnumerable // 1
{
private Monster[] mas;
private int n;
public Stado()
{
mas = new Monster[10];
n = 0;
}
public IEnumerator GetEnumerator()
{
for (int i = 0; i < n; ++i) yield return mas[i]; // 2
}
public void Add(Monster m)
{
if (n >= 10) return;
mas[n] = m;
++n;
}
}
class Class1
{ static void Main()
{
Stado s = new Stado();
s.Add(new Monster());
s.Add(new Monster("Вася"));
s.Add(new Daemon());
foreach (Monster m in s) m.Passport();
}
}
}
Листинг 5. Класс с итератором
Все, что требуется сделать в версии 2.0 для поддержки перебора — указать, что класс реализует интерфейс IEnumerable (оператор 1), и описать итератор (оператор 2). Доступ к нему может быть осуществлен через методы MoveNext и Current интерфейса IEnumerator.
Преимущество использования итераторов заключается в том, что для одного и того же класса можно задать различный порядок перебора элементов. В листинге 6 описаны две дополнительные стратегии перебора элементов класса Stado, введенного в листинге 5 — перебор в обратном порядке и выборка только тех объектов, которые являются экземплярами класса Monster.
using System;
using System.Collections;
using MonsterLib;
namespace ConsoleApplication1
{
class Monster {... }
class Daemon {... }
class Stado: IEnumerable
{
private Monster[] mas;
private int n;
public Stado()
{
mas = new Monster[10];
n = 0;
}
public IEnumerator GetEnumerator()
{
for (int i = 0; i < n; ++i) yield return mas[i];
}
public IEnumerable Backwards() // в обратном порядке
{
for (int i = n - 1; i >= 0; --i) yield return mas[i];
}
public IEnumerable MonstersOnly() // только монстры
{
for (int i = 0; i < n; ++i)
if (mas[i].GetType().Name == "Monster")
yield return mas[i];
}
public void Add(Monster m)
{
if (n >= 10) return;
mas[n] = m;
++n;
}
}
class Class1
{ static void Main()
{
Stado s = new Stado();
s.Add(new Monster());
s.Add(new Monster("Вася"));
s.Add(new Daemon());
foreach (Monster i in s) i.Passport();
foreach (Monster i in s.Backwards()) i.Passport();
foreach (Monster i in s.MonstersOnly()) i.Passport();
}
}
}
Листинг 6. Реализация нескольких стратегий перебора
Теперь, когда вы получили представление об итераторах, рассмотрим их более формально. Блок итератора синтаксически представляет собой обычный блок и может встречаться в теле метода, операции или части get свойства, если соответствующее возвращаемое значение имеет тип IEnumerable или IEnumerator.
В теле блока итератора могут встречаться две конструкции:
· yield return формирует значение, выдаваемое на очередной итерации;
· yield break сигнализирует о завершении итерации.
Ключевое слово yield имеет специальное значение для компилятора только в этих конструкциях.
Код блока итератора выполняется не так, как обычные блоки. Компилятор формирует служебный объект-перечислитель, при вызове метода MoveNext которого выполняется код блока итератора, выдающий очередное значение с помощью ключевого слова yield. Следующий вызов метода MoveNext объекта-перечислителя возобновляет выполнение блока итератора с момента, на котором он был приостановлен в предыдущий раз.
Контейнерные классы
|
|
|
Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...
Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...
Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...
© cyberpediasu.com 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!