Как я понимаю, IEnumerable и IQueryable являются отсроченным исполнением. Почему бы не использовать IList для поддержки отсроченного исполнения?
Почему 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
создается при доступе (есть всевозможные проблемы, которые могут возникнуть с отсроченным исполнением, например, т.е. не иметь возможности доступа к исходным данным источник) - это возвращается к первой точке.