Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Топ:
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Устройство и оснащение процедурного кабинета: Решающая роль в обеспечении правильного лечения пациентов отводится процедурной медсестре...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Интересное:
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Уполаживание и террасирование склонов: Если глубина оврага более 5 м необходимо устройство берм. Варианты использования оврагов для градостроительных целей...
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Дисциплины:
2017-11-27 | 284 |
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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!