Почему IList не откладывает исполнение? - PullRequest
11 голосов
/ 07 сентября 2011

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

Ответы [ 5 ]

34 голосов
/ 08 сентября 2011

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

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

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

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

21 голосов
/ 07 сентября 2011

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

8 голосов
/ 07 сентября 2011

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

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

3 голосов
/ 07 сентября 2011

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

Что будет отложено и до какого времени?

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

2 голосов
/ 07 сентября 2011

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

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