Невозможно применить индексирование с помощью [] к выражению типа 'System.Collections.Generic.IEnumerable <>

Есть ли какая-то конкретная причина, по которой индексация не разрешена в IEnumerable.

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

Спасибо,

61
задан Ani 3 September 2010 в 20:33
поделиться

2 ответа

Потому что это не так.

Индексирование регулируется IList. IEnumerable означает «У меня есть некоторые возможности IList, но не все».

Некоторые коллекции (например, связанные списки) практически невозможно индексировать. Но к ним можно обращаться по пунктам. IEnumerable предназначен для таких коллекций. Обратите внимание, что коллекция может реализовывать как IList, так и IEnumerable (и многие другие). Как правило, вы найдете только IEnumerable в качестве параметра функции, что означает, что функция может принимать любой тип коллекции, поскольку все, что ей нужно, — это простейший режим доступа.

69
ответ дан 24 November 2019 в 17:12
поделиться

Интерфейс IEnumerable не включает индексатор, вы, вероятно, путаете его с IList

Если объект действительно является IList (например, List или массивом T[]), попробуйте также сделать ссылку на него типа IList.

В противном случае вы можете использовать myEnumerable.ElementAt(index), который использует метод расширения Enumerable.ElementAt. Это должно работать для всех IEnumerable s . Обратите внимание, что если объект (времени выполнения) не реализует IList, это приведет к перечислению всех первых элементов index + 1, при этом все, кроме последнего, будут отброшены. .

РЕДАКТИРОВАТЬ: В качестве пояснения, IEnumerable — это просто интерфейс, представляющий «то, что предоставляет перечислитель». Конкретной реализацией вполне может быть своего рода список в памяти, который разрешает быстрый доступ по индексу, а может и нет. Например, это может быть коллекция, которая не может эффективно удовлетворить такой запрос, например связанный список (как упоминал Джеймс Карран). Это может даже быть отсутствие структуры данных в памяти, например, итератор, в котором элементы генерируются («выдаются») по требованию, или перечислитель, который извлекает элементы из некоторого удаленного источник данных. Поскольку IEnumerable должен поддерживать все эти случаи, индексаторы исключены из его определения.

45
ответ дан 24 November 2019 в 17:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: