Есть ли какая-то конкретная причина, по которой индексация не разрешена в IEnumerable.
Я нашел обходной путь для моей проблемы, но просто любопытно узнать, почему он не позволяет индексировать.
Спасибо,
Потому что это не так.
Индексирование регулируется IList
. IEnumerable
означает «У меня есть некоторые возможности IList, но не все».
Некоторые коллекции (например, связанные списки) практически невозможно индексировать. Но к ним можно обращаться по пунктам. IEnumerable
предназначен для таких коллекций. Обратите внимание, что коллекция может реализовывать как IList, так и IEnumerable (и многие другие). Как правило, вы найдете только IEnumerable
в качестве параметра функции, что означает, что функция может принимать любой тип коллекции, поскольку все, что ей нужно, — это простейший режим доступа.
Интерфейс IEnumerable
не включает индексатор, вы, вероятно, путаете его с IList
Если объект действительно является IList
(например, List
или массивом T[]
), попробуйте также сделать ссылку на него типа IList
.
В противном случае вы можете использовать myEnumerable.ElementAt(index)
, который использует метод расширения Enumerable.ElementAt. Это должно работать для всех IEnumerable
s .
Обратите внимание, что если объект (времени выполнения) не реализует IList
, это приведет к перечислению всех первых элементов index + 1
, при этом все, кроме последнего, будут отброшены. .
РЕДАКТИРОВАТЬ:
В качестве пояснения, IEnumerable
— это просто интерфейс, представляющий «то, что предоставляет перечислитель». Конкретной реализацией вполне может быть своего рода список в памяти, который разрешает быстрый доступ по индексу, а может и нет. Например, это может быть коллекция, которая не может эффективно удовлетворить такой запрос, например связанный список (как упоминал Джеймс Карран). Это может даже быть отсутствие структуры данных в памяти, например, итератор, в котором элементы генерируются («выдаются») по требованию, или перечислитель, который извлекает элементы из некоторого удаленного источник данных. Поскольку IEnumerable
должен поддерживать все эти случаи, индексаторы исключены из его определения.