Почему обход вперед только большую часть времени? - PullRequest
5 голосов
/ 19 февраля 2011

Я заметил, что многие итераторы или устройства чтения данных пересылаются только вперед, как DataReader , XmlReader , IEnumerator , еще много (вы получилиidea) .

Итак, просто спрашиваю, почему они только для пересылки , обычно, когда я создаю итератор данных для своих пользовательских нужд, я обычно пытаюсь добавить поддержку навигации с обеих сторон.Я согласен с тем, что большую часть времени нам не нужно проходить назад, но иногда нам это нужно, и поэтому мы в конечном итоге создаем temp переменных или что-то для хранения данных, когда это необходимо.


Так что мои вопросыявляются:

  • Почему большинство итераторов данных только вперед

  • Я ошибаюсь в создании итератора с обратным прохождениемЧитатель данных.если нет, то почему у фреймворка нет такой поддержки для встроенных итераторов данных.

  • Есть ли у нас серьезный недостаток производительности или его просто не считается хорошим дизайном чтобы иметь такую ​​функцию.


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

1 Ответ

9 голосов
/ 19 февраля 2011

«только вперед» - это:

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

например, если вы читаете данные из базы данных, сетевого потока и т. Д., Вы можете гарантировать только «пересылку». Мы, конечно, не хотим произвольно буферизовать все эти данные - это может быть огромный потенциально.

Если клиент считает, что у него есть нормальный объем данных, он всегда может вызвать ToList() и т. Д., Чтобы сохранить его в памяти и разрешить произвольный доступ.

Например, рассмотрим эту совершенно правильную последовательность:

public static IEnumerable<int> LotsOfData() {
    var random = new Random();
    while(true) yield return random.Next();
}
  • его нельзя изменить без буферизации
  • длина его бесконечна, поэтому не может быть помещена в буфер

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

...