Enumerator что это
Как мы увидели, основной для большинства коллекций является реализация интерфейсов IEnumerable и IEnumerator. Благодаря такой реализации мы можем перебирать объекты в цикле foreach :
foreach(var item in перечислимый_объект)
Перебираемая коллекция должна реализовать интерфейс IEnumerable.
Интерфейс IEnumerable имеет метод, возвращающий ссылку на другой интерфейс — перечислитель:
public interface IEnumerable
А интерфейс IEnumerator определяет функционал для перебора внутренних объектов в контейнере:
public interface IEnumerator < bool MoveNext(); // перемещение на одну позицию вперед в контейнере элементов object Current // текущий элемент в контейнере void Reset(); // перемещение в начало контейнера >
Метод MoveNext() перемещает указатель на текущий элемент на следующую позицию в последовательности. Если последовательность еще не закончилась, то возвращает true. Если же последовательность закончилась, то возвращается false.
Свойство Current возвращает объект в последовательности, на который указывает указатель.
Метод Reset() сбрасывает указатель позиции в начальное положение.
Каким именно образом будет осуществляться перемещение указателя и получение элементов зависит от реализации интерфейса. В различных реализациях логика может быть построена различным образом.
Например, без использования цикла foreach перебирем массив с помощью интерфейса IEnumerator:
using System.Collections; string[] people = ; IEnumerator peopleEnumerator = people.GetEnumerator(); // получаем IEnumerator while (peopleEnumerator.MoveNext()) // пока не будет возвращено false < string item = (string)peopleEnumerator.Current; // получаем элемент на текущей позиции Console.WriteLine(item); >peopleEnumerator.Reset(); // сбрасываем указатель в начало массива
Реализация IEnumerable и IEnumerator
Рассмотрим простешую реализацию IEnumerable на примере:
using System.Collections; Week week = new Week(); foreach (var day in week) < Console.WriteLine(day); >class Week : IEnumerable < string[] days = < "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" >; public IEnumerator GetEnumerator() => days.GetEnumerator(); >
В данном случае класс Week, который представляет неделю и хранит все дни недели, реализует интерфейс IEnumerable. Однако в данном случае мы поступили очень просто — вместо реализации IEnumerator мы просто возвращаем в методе GetEnumerator объект IEnumerator для массива.
public IEnumerator GetEnumerator() => days.GetEnumerator();
Благодаря этому мы можем перебрать все дни недели в цикле foreach.
В то же время стоит отметить, что для перебора коллекции через foreach в принципе необязательно реализовать интерфейс IEnumerable. Достаточно в классе определить публичный метод GetEnumerator , который бы возвращал объект IEnumerator. Например:
class Week < string[] days = < "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" >; public IEnumerator GetEnumerator() =>days.GetEnumerator(); >
Однако это было довольно просто — мы просто используем уже готовый перчислитель массива. Однако, возможно, потребуется задать свою собственную логику перебора объектов. Для этого реализуем интерфейс IEnumerator :
using System.Collections; class WeekEnumerator : IEnumerator < string[] days; int position = -1; public WeekEnumerator(string[] days) =>this.days = days; public object Current < get < if (position == -1 || position >= days.Length) throw new ArgumentException(); return days[position]; > > public bool MoveNext() < if (position < days.Length - 1) < position++; return true; >else return false; > public void Reset() => position = -1; > class Week < string[] days = < "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" >; public IEnumerator GetEnumerator() => new WeekEnumerator(days); >
Здесь теперь класс Week использует не встроенный перечислитель, а WeekEnumerator, который реализует IEnumerator.
Ключевой момент при реализации перечислителя — перемещения указателя на элемент. В классе WeekEnumerator для хранения текущей позиции определена переменная position. Следует учитывать, что в самом начале (в исходном состоянии) указатель должен указывать на позицию условно перед первым элементом. Когда будет производиться цикл foreach, то данный цикл вначале вызывает метод MoveNext и фактически перемещает указатель на одну позицию в перед и только затем обращается к свойству Current для получения элемента в текущей позиции.
Затем в программе мы можем аналогичным образом перебирать объект Week с помощью цикла foreach:
Week week = new Week(); foreach(var day in week)
Обобщенная версия IEnumerator
В примерах выше использовались необобщенные версии интерфейсов, однако мы также можем использовать их обобщенные двойники:
using System.Collections; class WeekEnumerator : IEnumerator < string[] days; int position = -1; public WeekEnumerator(string[] days) =>this.days = days; public string Current < get < if (position == -1 || position >= days.Length) throw new ArgumentException(); return days[position]; > > object IEnumerator.Current => Current; public bool MoveNext() < if (position < days.Length - 1) < position++; return true; >else return false; > public void Reset() => position = -1; public void Dispose() < >> class Week < string[] days = < "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" >; public IEnumerator GetEnumerator() => new WeekEnumerator(days); >
В данном случае реализуем интерфейс IEnumerator , соответственно в свойстве Current нам надо возвратить объект string. В этом случае при переборе в цикле foreach перебираемые объекты будут автоматически представлять тип string :
Week week = new Week(); foreach (string day in week)
Unity: Что представляет из себя Coroutine и зачем там IEnumerator
Название статьи — это вопрос, который мне задали на собеседовании на позицию Middle. В этой статье мы расмотри корутины в Unity, что они из себя представляют, и заодно захватим тему Enumerator\Enumerable в С# и небольшую тайну foreach. Статья должна быть очень полезной для начинающих и интересной для разработчиков с опытом.
И так, как всем известно, метод, представляющего из себя Coroutine в Unity, выглядит следующим образом:
IEnumerator Coroutine()
Немного информации об корутинах в Unity и IEnumerator
В качестве возвращаемого объекта после yield return может быть:
- new WaitForEndOfFrame() — останавливает выполнение до конца следующего кадра
- new WaitForFixedUpdate() — останавливает выполнение до следующего кадра физического движка.
- new WaitForSeconds(float x) — останавливает выполнение на x секунд игрового времени (оно может быть изменено через Time.timeScale)
- new WaitForSecondsRealtime(float x) — останавливает выполнение на x секунд реального времени
- new WaitUntil(Func) — останавливает выполнение до момента, когда Func не вернет true
- new WaitWhile(Func) — обратное к WaitUntil, продолжает выполнение, когда Func возвращает false
- null — то же, что и WaitForEndOfFrame(), но выполнение продолжается в начале след. кадра
- break — завершает корутину
- StartCoroutine() — выполнение останавливает до момента, когда новая начатая корутина не закончится.
Запускаются корутины через StartCoroutine(Coroutine()).
Корутины не являются асинхронными, они выполняются в основном потоке приложения, в том же, что и отрисовка кадров, инстансирование объектов и т.д., если заблокировать поток в корутине, то остановится все приложение, корутины с асинхронностью использовали бы «IAsyncEnumerator», который Unity не поддерживает. Корутина позволяет растянуть выполнение на несколько кадров, что бы не нагружать 1 кадр большими вычислениями. Unity предоставляет тип UnityWebRequest для Http запросов, которые можно выполнять «асинхронно» в несколько кадров, что может показаться «асинхронностью», на самом деле же это обертка над нативным асинхронным HttpClient, которая предоставляет некоторую информацию синхронно, по типу поля isDone, которое отображает — закончился ли запрос или еще ожидается ответ, но сам запрос идет асинхронно.
IEnumerator — это стандартная реализация паттерна «итератор» в C#, которая содержит синтаксический сахар для хранения состояния. (спасибо @SadOceanза дополнение)
Он возвращает IEnumerator и имеет необычный return с припиской yield.
yield return это составляющая IEnumerator, эта связка преобразуется, при компиляции, в машину состояний, которая сохраняет позицию в коде, ждет команды MoveNext от IEnumerator и продолжает выполнение до следующего yield return или конца метода, больше подробной информации можно найти на сайте майкрософта.
Интерфейс IEnumerator, в свою очередь, содержит следующие элементы:
public interface IEnumerator < object Current < get; >bool MoveNext(); void Reset(); >
Под капотом Unity это обрабатывается примерно так: Unity получает IEnumerator, который передается через StartCoroutine(IEnumerator), сразу вызывает MoveNext, для того, чтобы код дошел до первого yield return, здесь стоит уточнить, что при вызове такого метода выполнение кода внутри метода не начинается самостоятельно, и необходимо вызвать MoveNext, это можно проверить простым скриптом, который представлен под этим абзатцем, а затем если Unity получает в Current объект типа YieldInstruction, то выполняет инструкцию и снова вызывает MoveNext, то есть, метод может возвращать любой тип, и если это не YieldInstruction, то Unity его обработает как yield return null.
private IEnumerator _coroutine; // Start is called before the first frame update void Start() < _coroutine = Coroutine(); >// Update is called once per frame void Update() < if (Time.time >5) _coroutine.MoveNext(); > IEnumerator Coroutine() < while (true) < Debug.Log(Time.time); yield return null; >>
Отлично, мы разобрали основной момент, а именно, что такое IEnumerator и как он работает. Теперь разберем такой случай:
Опишем класс, который наследует интерфейс IEnumerator
class TestEnumerator : IEnumerator < public object Current =>new WaitForSeconds(1); public bool MoveNext() < Debug.Log(Time.time); return true; >public void Reset() < >/// Этот класс равносилен следующей корутине: /// IEnumerator Coroutine() /// < /// while(true)< /// Debug.Log(Time.time); /// yield return new WaitForSeconds(1); /// >/// > >
И мы теперь его можем использовать следующим способом:
void Start()
И так, мы рассмотрели IEnumerator и корутины, здесь можно еще долго рассматривать разные варианты использования, но в корне остается передача IEnumerator в каком либо виде в метод StartCoroutine.
Теперь предлагаю рассмотреть IEnumerable, этот интерфейс наследуют нативный массив C#, List из System.Generic и прочие подобные типы, вся его суть заключается в том, что он содержит метод GetEnumerator, который возвращает IEnumerator:
public interface IEnumerable
Реализуем простенький пример:
class TestEnumerable : IEnumerable < public IEnumerator GetEnumerator() < return new TestEnumerator(); >>
И теперь, мы можем сделать следующее:
IEnumerator Coroutine() < foreach (var delay in new TestEnumerable()) < Debug.Log($""); yield return delay; > >
Применений для этого множество, например можно добавить в TestEnumerator случайное время задержки:
class TestEnumerator : IEnumerator < public object Current =>new WaitForSeconds(_currDelay); private float _currDelay; public bool MoveNext() < _currDelay = Random.Range(1.0f, 3.0f); return true; >public void Reset() < >>
И немного магии для начинающих: foreach не требует чтобы объект возвращаемый GetEnumerator реализовывал IEnumerable, самое главное, что бы тип после «in» имел метод GetEnumerator(), и возвращал тип с свойством Current и методом MoveNext(), то есть, мы можем сделать так:
class TestEnumerator // Здесь было наследование от IEnumerator < public object Current =>new WaitForSeconds(_currDelay); private float _currDelay; public bool MoveNext() < _currDelay = Random.Range(1.0f, 3.0f); return true; >// Здесь был Reset из IEnumerator, он теперь не нужен :) > class TestEnumerable // Здесь было наследование от IEnumerable < // Возвращаемый тип был IEnumerator public TestEnumerator GetEnumerator() < return new TestEnumerator(); >>
Как видно, нигде нет наследования и любого упоминания IEnumerable и IEnumerator, но при этом мы так же можем использовать следующий код:
IEnumerator Coroutine() < foreach (var delay in new TestEnumerable()) < Debug.Log($""); yield return delay; > >
И так, разобрав корутины, IEnumerator, IEnumerable и foreach нужно бы увидеть пример использования этих знаний на практике:
Более удобные в использовании Coroutine
Здесь я хотел описать реализацию корутины с токеном отмены (CancelationToken) и событиями старта\завершения с возможность ставить выполнение на паузу, но я опоздал, и на github есть готовое решение, советую к изучение, хоть я и не полностью согласен с реализацией:
Буду благодарен критике и замечаниям, так же советую посмотреть другие мои статьи.
Перевод «enumerator,» на русский
Included in this category are all forms filled by peripheral organs — for example, list of holdings and number of questionnaires for each enumerator, help the work of enumerators in the field.
К этой категории относятся все заполняемые периферийными органами формы (например, список хозяйств и число вопросников на каждого счетчика, которые помогают работать счетчикам на местах.
a) report of the enumerator, structured in two parts, in order to collect information either about person or about interview.
а) отчет счетчика, состоящий из двух частей, — для сбора информации о лицах или об опросе.
This function can be used by any enabled operator type (enumerator, coordinator or municipal manager).
Данная функция может использоваться уполномоченными на это операторами (счетчиками, координаторами или муниципальными управляющими).
Some municipalities proceed to a weekly assessment with each enumerator, during roughly two hours.
В некоторых муниципалитетах проводятся ежемесячные примерно двухчасовые контрольные собеседования с каждым счетчиком.
The enumerator, trying to be helpful, I think!
Его ассистентом, пытается мне помочь, я думаю.
Likewise census managers can provide the enumerator, via the hand held devise, with updates on forms received and which households need to be followed-up.
Аналогичным образом администраторы могут через переносное устройство сообщать счетчику обновленную информацию о полученных переписных листах и о том, какие домашние хозяйства требуют повторного посещения.
The Enumerator, to whom the delivery and collection of the questionnaires was assigned, constituted the basic element of the structure.
Базовым элементом структуры являлся счетчик, которому поручались раздача и сбор анкет.
The follow-up of collection, as the operations progress and for each enumerator, allows verifying the progress of the distribution and of the return of the forms and to spot possible difficulties found by the enumerators, or shortcomings.
Контроль за процессом сбора данных и работой каждого конкретного счетчика позволяет проследить за тем, как идет раздача и сбор вопросников, а также выявить трудности, с которыми могут столкнуться счетчики, или возможные недостатки.
The enumerator, when interviewing Mr. S.V. Makarov at the place of his actual residence, found out that he had another residence.
Переписчик при опросе Макарова С.В. по месту его фактического проживания выясняет, что он имеет еще одно место жительства.
While the key issue is the flow of timely information to the census enumerator, the same systems set up to ensure this can also provide for a close to real time two-way flow of information between census managers and enumeration staff.
Хотя ключевой задачей является снабжение счетчиков своевременной информацией, системы, созданные для этого, могут также обеспечить практически в реальном времени двусторонний обмен информацией между администраторами и счетчиками.
Although every effort has been made to ensure that every dwelling in the mail-out portion is on the address list or that every dwelling in the listing and delivery portion is listed by an enumerator, some dwellings may still be missed.
Несмотря на все усилия по обеспечению того, чтобы каждое жилище той части опросных листов, которые рассылаются по почте, было включено в наш список адресов или чтобы каждое жилище той части опросных листов, которые раздаются домохозяйствам, были зарегистрированы счетчиком, сохраняется риск пропуска некоторых жилищ.
If aerial photography is not used, or the circle is drawn directly by the enumerator, then non-sampling errors are probably much higher.
При отказе от использования аэрофотосъемки или при нанесении круга непосредственно счетчиком величина постоянных ошибок будет, вероятно, намного больше.
Too thick paper is too heavy to carry by the enumerator, needs more space in the boxes transferred from the field to the data capture site and; jams in the scanner’s feeder.
Слишком толстая бумага является тяжелой для переноски счетчицами, занимает много места при перевозке в центры ввода данных и может застревать в блоке питания сканирующего устройства.
Since 1981 in Portugal, these censuses have been held with the support of an important cartographic infrastructure dividing the territory into statistical areas per each enumerator, relying on cartography.
С 1981 года переписи в Португалии проводятся с опорой на масштабную картографическую инфраструктуру, обеспечивающую разбивку на основе картографии территории страны на статистические участки, за каждым из которых закреплено по одному переписчику.
Предложить пример
Другие результаты
Iterators in the.NET Framework are called «enumerators» and represented by the IEnumerator interface.
Итераторы в.NET Framework называются перечислителями (enumerators) и представлены интерфейсом IEnumerator.
An element of the enumerator returned by the ForEach Enumerator does not implement IEnumerator, contradicting the CollectionEnumerator property of the ForEach Enumerator.
Элемент перечислителя, возвращенный перечислителем ForEach, не реализует интерфейс IEnumerator, противореча свойству CollectionEnumerator перечислителя ForEach.
Enumerators search for available data sources and other enumerators.
Перечислитель (Enumerator) выполняет поиск источников данных или других перечислителей.
Municipalities want to work in different ways: some are enumerator area-oriented, others want to distribute work independently from enumerator areas.
Муниципалитеты хотят работать с использованием различных методов: для одних наиболее важным является использование на участках переписчиков, в том время как другие хотели бы распределять рабочую нагрузку вне зависимости от участков, закрепленных за переписчиками.
Enabled operators can also assign enumerators to coordinators, and census tracts (and questionnaires) to enumerators.
Уполномоченные операторы могут также распределять счетчиков между координаторами, а переписные участки (и вопросники) между счетчиками.
The numerator of a specific monitor m (Numeratorm) is a counter indicating the number of times a vehicle has been operated such that all monitoring conditions necessary for that specific monitor to detect a malfunction have been encountered.
Числитель конкретного контрольно-измерительного устройства «м« (числительм) означает функцию счетчика, показывающую количество случаев, когда во время работы транспортного средства возникали все условия мониторинга, необходимые для выявления соответствующего сбоя конкретным контрольно-измерительным устройством.
Возможно неприемлемое содержание
Примеры предназначены только для помощи в переводе искомых слов и выражений в различных контекстах. Мы не выбираем и не утверждаем примеры, и они могут содержать неприемлемые слова или идеи. Пожалуйста, сообщайте нам о примерах, которые, на Ваш взгляд, необходимо исправить или удалить. Грубые или разговорные переводы обычно отмечены красным или оранжевым цветом.
Зарегистрируйтесь, чтобы увидеть больше примеров. Это просто и бесплатно
Ничего не найдено для этого значения.
Больше примеров
Предложения, которые содержат enumerator,
Новое: Reverso для Windows
Переводите текст из любого приложения одним щелчком мыши .
Скачать бесплатно
Перевод голосом, функции оффлайн, синонимы, спряжение, обучающие игры
Результатов: 1016 . Точных совпадений: 14 . Затраченное время: 220 мс
Помогаем миллионам людей и компаний общаться более эффективно на всех языках.
Перевод «enumerator» на русский
Another enumerator revisited the holding already interviewed and made a second interview using the same questionnaire.
В опрошенные хозяйства повторно направлялся другой счетчик, который проводил второй опрос с использованием того же вопросника.
On average, one enumerator visited 60-80 households during the 15 days of the census.
В среднем за 15 дней, в течение которых проводилась перепись, один счетчик посетил 60-80 домашних хозяйств.
Get the enumerator to enumerate over objects from a variable
Получить перечислитель, чтобы перечислить объекты из переменной
No Foreach enumerator is assigned to the wrapper.
Для упаковщика не назначен перечислитель Foreach.
Depending on the responses received, the enumerator determines the need for inclusion of a particular respondent in this list.
В зависимости от полученных ответов переписчик определяет необходимость включения того или иного респондента в данный список.
All questions were in Estonian language and could be translated by the enumerator if necessary.
Все вопросы были на эстонском языке, при необходимости переводил переписчик.
The physical presence of enumerator during interview ensures the identity of the respondent and helps in clarifying or rephrasing unclear questions.
Физическое присутствие счетчика во время опроса гарантирует подлинность респондента и помогает прояснить или иначе сформулировать неясные вопросы.
Each enumerator was assigned a code number by the regional administrative organ responsible for survey.
Районный административный орган, ответственный за проведение обследования, присвоил каждому счетчику соответствующий кодовый номер.
The areas for each tract would be measured by the enumerator using a methodology of rectangular.
Площадь каждого участка замеряется счетчиком при помощи метода прямоугольников.
The enumerator is out of range.
Перечислитель выходит за пределы допустимого диапазона.
Census questionnaires will be delivered through the postal system or hand-delivered by an enumerator.
Переписные листы будут отправляться по почте или вручаться счетчиками.
Under the traditional collection methodology, completed questionnaires are returned to the local enumerator for completeness checks and follow-up when necessary.
В соответствии с традиционной методологией сбора данных заполненные переписные листы возвращаются местным счетчикам для проверки на полноту и принятия при необходимости соответствующих последующих мер.
The enumerator is a key person, completing the questionnaire or giving advice and answering questions as required.
Счетчик является ключевым лицом, заполняющим опросник, дающим рекомендации и отвечающим на задаваемые вопросы.
This function can be used by any enabled operator type (enumerator, coordinator or municipal manager).
Данная функция может использоваться уполномоченными на это операторами (счетчиками, координаторами или муниципальными управляющими).
Users enabled to these functions can enter, visualise and modify coordinator and enumerator personal information.
Имеющие доступ к этим функциям пользователи могут получать, изучать и менять личные данные координаторов и счетчиков.
Timely monitoring of enumerator work will allow for more timely interventions where census collection is having problems.
Оперативный мониторинг работы счетчиков позволит своевременно принимать меры в случае возникновения проблем со сбором данных.
This message only need contain the census reference number and a code to indicate the action required on the part of the enumerator.
Это сообщение должно содержать только переписной идентификационный номер и код для указания действия, требуемого со стороны счетчика.
A respondent may therefore feel more reassured that the enumerator is part of the official census process.
Это может содействовать повышению уверенности респондентов в том, что счетчик является участником официального процесса переписи.
In older censuses, a government worker known as an enumerator would visit households and record information.
В более старых переписях государственный служащий, известный как счетчик, посещал домашние хозяйства и записывал информацию.
Therefore households have to be verified on the ground, typically by an enumerator visit or post out.
Таким образом, домашние хозяйства должны быть проверены на местах, как правило, визитом переписчика или отправкой почты.
Возможно неприемлемое содержание
Примеры предназначены только для помощи в переводе искомых слов и выражений в различных контекстах. Мы не выбираем и не утверждаем примеры, и они могут содержать неприемлемые слова или идеи. Пожалуйста, сообщайте нам о примерах, которые, на Ваш взгляд, необходимо исправить или удалить. Грубые или разговорные переводы обычно отмечены красным или оранжевым цветом.
Зарегистрируйтесь, чтобы увидеть больше примеров. Это просто и бесплатно
Ничего не найдено для этого значения.
Предложить пример
Больше примеров Предложить пример
Новое: Reverso для Windows
Переводите текст из любого приложения одним щелчком мыши .
Скачать бесплатно
Перевод голосом, функции оффлайн, синонимы, спряжение, обучающие игры
Результатов: 205 . Точных совпадений: 205 . Затраченное время: 67 мс
Помогаем миллионам людей и компаний общаться более эффективно на всех языках.