Почему IList не отсрочено исполнение?

Как я понимаю, IEnumerable и IQueryable являются отсроченным исполнением. Почему бы не использовать IList для поддержки отсроченного исполнения?

Ответ 1

Чем дольше я думаю об этом, тем больше сомневаюсь, действительно ли вся идея "отсроченного исполнения" вообще имеет педагогическую ценность.

Я отвечу на ваш вопрос, отрицая это. IEnumerable<T>, IQueryable<T> и IList<T> никоим образом не представляют собой "отложенные" или "нетерпеливые" вычисления.

Скорее, интерфейсы представляют возможность предоставления услуги. IEnumerable<T> представляет собой сервис "Я могу обеспечить последовательность, возможно бесконечную, элементов типа T по одному за раз". IQueryable<T> представляет сервис "Я могу представить запрос к источнику данных и предоставлять результаты этого запроса по запросу". IList<T> представляет службу "Я могу предоставить произвольный доступ к возможно изменяемому, конечному размеру списка элементов типа T".

Ни одна из этих служб ничего не говорит о деталях реализации поставщиков услуг. Поставщик услуги IList<T> может быть полностью ленив; провайдер службы IQueryable<T> может быть полностью готов. Если вы хотите сделать отложенное выполнение IList<T>, вы идете прямо вперед. Никто вас не останавливает!

Ответ 2

IList<T> поддерживает произвольный доступ с помощью индексатора, а также свойство Count. Оба они противоречат духу отложенного исполнения с потоковыми данными, если вы не предполагаете, что вам действительно нужно что-то, что загружает весь список, как только вы получаете доступ к чему-либо. Если это то, что вам нужно, Lazy<T> может быть билетом...

Ответ 3

Как заметил @Joe, IList<T> абстрагирует существительное. IEnumerable<T> и IQueryable<T> - абстракции глаголов.

IList<T> - это абстракция коллекции, которую можно рассматривать как список. IEnumerable<T> и 'IQueryable абстрактные действия: перечисление или запрос элементов, содержащихся в базовой коллекции.

Ответ 4

Подумайте о последствиях того, что вы говорите.

Что будет отложено, и до тех пор, пока?

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

Ответ 5

Существует множество причин, только некоторые:

  • a IList должен быть независимым от базового источника данных, который был использован для создания IList
  • доступ к элементу IList по индексу ожидается O (1) - с отсроченным исполнением это не может быть гарантировано - доступ может быть очень медленным, по крайней мере в первый раз.
  • доступ к члену IList не должен приводить к исключению из-за того, как IList создается при доступе (есть всевозможные проблемы, которые могут возникнуть с отсроченным исполнением, например, т.е. не иметь возможности доступа к исходным данным источник) - это возвращается к первой точке.