Добавить в корзинуПозвонить
Найти в Дзене
using Dev

Итератор C#

Описание Шаблон Итератор обеспечивает последовательный доступ ко всем элементам коллекции, не раскрывая при этом её внутренней реализации. Данный шаблон применяется, если необходимо: Таким образом, задача Итератора упростить обход и сделать его однообразным для коллекций различных типов. Причем реализация шаблона может находиться как в объекте, представляющим коллекции, так и отдельно от него. Многие языки высокого уровня (C#, C++, F#, PHP) имеют собственную на поддержку Итераторов. Но если стандартных возможностей не достаточно или нужна своя логика обхода элементов, то возможно реализовать данный шаблон самостоятельно. Кроме того, его реализация потребуется и для пользовательских типов коллекций. Итераторы можно разделить на два вида: Определим участников шаблона: Особенности реализации Реализация алгоритма обхода коллекции часто располагается в самом Итераторе. Это позволяет создать нескольких вариантов перебора элементов. Другим подходом является его размещение в самой коллекции. П
Оглавление

Описание

Шаблон Итератор обеспечивает последовательный доступ ко всем элементам коллекции, не раскрывая при этом её внутренней реализации.

Данный шаблон применяется, если необходимо:

  • обеспечить доступ к содержимому объекта без раскрытия его реализации;
  • (или) предоставить нескольких способов обхода коллекции;
  • (или) реализовать единый интерфейс обхода различных коллекций.

Таким образом, задача Итератора упростить обход и сделать его однообразным для коллекций различных типов. Причем реализация шаблона может находиться как в объекте, представляющим коллекции, так и отдельно от него.

Многие языки высокого уровня (C#, C++, F#, PHP) имеют собственную на поддержку Итераторов. Но если стандартных возможностей не достаточно или нужна своя логика обхода элементов, то возможно реализовать данный шаблон самостоятельно. Кроме того, его реализация потребуется и для пользовательских типов коллекций.

Итераторы можно разделить на два вида:

  1. Внешние – клиент получает экземпляр Итератора и сам запрашивает у него элементы коллекции.
  2. Внутренние -  клиент передает Итератору метод, который вызывается для каждого элемента коллекции.

Определим участников шаблона:

  1. Интерфейс итератора (IIterator) – определяет методы для доступа к элементам коллекций.
  2. Итератор (lterator) – реализация Итератора для конкретного типа коллекции.
  3. Интерфейс составного объекта, коллекции (IContainer) – задает способ получения Итератора клиентом.
  4. Составной объект, коллекция (Container) – реализация коллекции или фабрики, предоставляющие Итератор.

Особенности реализации

Реализация алгоритма обхода коллекции часто располагается в самом Итераторе. Это позволяет создать нескольких вариантов перебора элементов. Другим подходом является его размещение в самой коллекции. При этом Итератор будет содержать только текущее состояние обхода (например, позицию и направление) и называется курсором.

Модификация коллекции во время ее обхода является опасной операцией. Это может привести к тому, что её элемент может быть посещен несколько раз или не посещен вообще. Поэтому выделяют Устойчивые итераторы, которые гарантируют, что изменения коллекции не помешают обходу. Причем это должно достигаться без создания копий коллекции.

Обычно интерфейс Итератора состоит из следующих операций:

  • Reset() – устанавливает первый элемент списка в качестве текущего;
  • MoveNext() – переход на следующий элемент;
  • IsDone – проверяет есть ли еще элементы в коллекции;
  • Current – возвращает текущий элемент.

Этот список можно изменять. Например, объединить MoveNext(), IsDone и Current в один метод. Или добавить метод Skip(), позволяющий пропустить заданное число элементов или перейти на заданный. В некоторых случаях может быть полезно свойство содержащее ссылку на предыдущий элемент.

Отдельно стоит отметить Итераторы для древовидных структур, описываемых, например, шаблоном Компоновщик. При этом:

  • составные объекты возвращают Итератор для перечня своих потомков;
  • части (у которых нет потомков) возвращают вырожденный случай Итератора – NullIterator, который всегда сообщает что обход завершен.

Это позволит разработать Итератор структуры, который будет использовать Итераторы элементов для полного обхода дерева.

Реализация шаблона в общем виде

  • определяем тип Итератора (внешний или внутренний) и схему взаимодействия с коллекцией;
  • разрабатываем интерфейс Итератора IIterator или берем стандартный;
  • реализуем метод или фабрику (IContainer) для создания экземпляров Итератора;
  • клиент, используя IContainer, получает экземпляр Итератора и использует его для обхода коллекции не завися от ее типа.

Примеры реализации

Создадим класс стэка данных DataStack.

-2
-3

-4

Применение

-5
-6

Наука
7 млн интересуются