Какова причина IEnumerable/IEnumerable <T> интерфейсы, чтобы только иметь MoveNext?

В Java используйте java.util.concurrent пакеты в JDK 5 + вместо того, чтобы писать Ваше собственное. Как был упомянут выше, это - действительно поле для экспертов, и если у Вас нет свободного года или два, прокручивание Вашего собственного не является опцией.

7
задан Joan Venge 26 November 2009 в 23:18
поделиться

5 ответов

IEnumerable [] представляет последовательность данных, а не список произвольного доступа. Не все последовательности можно перевернуть или даже воспроизвести. Последовательности, основанные на сетевых потоках, доступе к базе данных и т. Д. - или эта красота:

IEnumerable<int> GetData() {
    Random rand = new Random();
    while(true) { yield return rand.Next(); }
}

Лучшее, что вы можете сделать, это начать заново - не , вызвав Reset () (который устарел) , но получая вместо этого новый счетчик.

Даже без Random тривиально придумать простые последовательности, которые не могут быть обращены (без буферизации и обращения буфера). Если хотите, попробуйте вместо этого посмотреть IList [] - вы можете получить доступ к данным через индексатор в любом порядке.

21
ответ дан 6 December 2019 в 06:14
поделиться

Есть много типов данных, для которых не имеет смысла иметь MovePrevious. Например, если вы получаете данные из сетевого подключения, предоставление MovePrevious потребует буферизации всего потока на случай, если вы вызвали этот метод. Это приведет к потере огромного количества памяти.

Сказав это, было бы полезно иметь другой тип , который поддерживал бы как MoveNext, так и MovePrevious (например, двусвязный список мог бы поддерживать это).

6
ответ дан 6 December 2019 в 06:14
поделиться

Удобство использования - не единственный фактор, влияющий на разработку интерфейса ... вы должны учитывать, насколько он будет универсальным и какие ограничения вы добавляете к нему.

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

Есть и другие интерфейсы помимо него, такие как IList, IQueryable. Используя наиболее подходящий для сценария, также сообщает тип использования, который он должен иметь.

1
ответ дан 6 December 2019 в 06:14
поделиться

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

1
ответ дан 6 December 2019 в 06:14
поделиться

Это связано с шаблоном в отношении «доходности». По сути, перечислители представляют собой простейшую возможную коллекцию, вы просто начинаете с начала и продолжаете до самого конца. Это означает, что их код для реализации перечисления чрезвычайно прост.

Также вы можете иметь функциональный код с использованием итераторов, которые никогда не «заканчиваются» как таковые, например

yield value++;

Вы просто будете получать увеличивающиеся числа, пока не остановитесь.

0
ответ дан 6 December 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: