Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...
Топ:
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации - обмен информацией между организацией и её внешней средой...
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Интересное:
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Дисциплины:
2017-11-27 | 285 |
5.00
из
|
Заказать работу |
|
|
Для унификации работы с любыми контейнерами введено несколько интерфейсов и несколько классов. Стандартные конструкции С# часто опираются на эти интерфейсы и классы. При работе с коллекциями любого вида они предоставляют проход по всем элементам. Для того чтобы коллекцию можно было использовать в цикле foreach, класс коллекций должен реализовывать интерфейс IEnumerable //перечисление, IEnumerable<T>.
У них есть метод GetEnumerator().
IEnumerator – базовый класс итератора. Именно итератор обычно передается в тех случаях, когда нужно проходить коллекцию. Итератор — это раздел кода, возвращающий упорядоченную последовательность значений одинакового типа. Итератор может использоваться в качестве основной части метода, оператора или метода доступа get. Объект итератора, начиная с С# 3.0, строится определенным образом. Он не создается с помощью оператора new явно. Пример «Обертка для коллекции»:
List<T>
public class StringListWrapper: IEnumerable <string>
{
private List<string> data = new List <string>();
public IEnumerator <string>GetEnumerator()
{ return data.GetEnumerator (); }
}
Если исходный класс не поддерживает интерфейс IEnumerable, тогда итератор придется построить. Это можно сделать 2-мя способами: 1. определить класс итератора путем реализации интерфейса IEnumerator. Это имеет смысл только в С# 2.0. Итератор как интерфейс имеет несколько методов: установки начального элемента и продвижение к следующему элементу, и признак завершения. 2. определение итератора на ходу:
public class StringListWrapper: IEnumerable <string>
{
private List<string> data = new List <string>();
public IEnumerator <string>GetEnumerator()
{
int i = 0;
while (i < data.Count)
{yield return data [ i ];
i++; }
}
}
yield – строит объект итератора, затем возвращает ссылку на основной элемент.
При вызове метода GetEnumerator компилятор выполняет ряд хитростей: 1) компилятор способен распознать, какие типы данных будут содержаться в объекте итератора; 2) компилятор конструирует объект анонимного типа и размещает в нем все необходимые поля данных; 3) эти поля данных в объекте итератора инициализируются.
|
IEnumerator<T>
{
void Reset (); // позволяет сбрасывать итератор в исходное состояние
bool MoveNext (); // позволяет переходить к след. элементу – передвигать итератор
T Current { get; }
}
Компилятор ищет блок yield и на его основе формирует метод MoveNext. При каждом выполнении строки
«yield return data [i];» наверх передается объект коллекции. Но ход выполнения цикла не прерывается, а останавливается с выходом из метода. При последовательном вызове метода MoveNext выполнение цикла продолжается со следующего оператора, т.е. оператора i++.
Существуют способы построения обратных и двунаправленныхитераторов. Итераторы можно снабжать дополнительными методами для управления. При конструировании классов итераторов и коллекций следуют следующему правилу: не следует делать так, чтобы один и тот же класс одновременно реализовывал оба интерфейса: IEnumerable<T>, IEnumerator<T>. Нельзя, чтобы один и тот же класс был и коллекцией, и итератором. При передаче коллекции в качестве параметра метода вследствие того, что параметры надо передавать как можно в более общем виде, часто передают не сами объекты коллекции, а итераторы или интерфейсы, которые реализуются классами коллекций. Всё зависит от того, какую функциональность коллекций собирается использовать метод. Если нужен только проход по коллекции, то используют IEnumerable<T>.
Более развитый интерфейс ICollection<T>. Он наследуется от IEnumerable<T>. Он дает дополнительные методы для вставки и удаления объекта, очистки коллекции, проверки принадлежности элемента коллекции.
Ещё более развитый интерфейс IList<T>: ICollection<T>. Он дает все операции по индексу ICollection.
Отдельное положение занимает интерфейс IDictionary<TKey, TValue>: IEnumerable. Он повторяет в себе методы ICollection + операции поиска по ключу, удаления.
Для сортированных коллекций используется интерфейс IComparer<T>.
У него есть единственный метод:
int Comparer(T a, T b) – возвращает целое значение (> 0 если a < b; 0, если a == b; < 0, если a > b).
|
|
Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!