Nuestros investigadores estrellas han agotado sus reservas de café, en su búsqueda todo el tiempo por la respuesta, hasta que Saúl halló la contestación en GitHub así que ahora la compartimos contigo.
Solución:
Porque no lo es.
La indexación está cubierta por IList
. IEnumerable
significa “Tengo algunos de los poderes de IList, pero no todos”.
Algunas colecciones (como una lista enlazada) no se pueden indexar de manera práctica. Pero se puede acceder a ellos elemento por elemento. IEnumerable
está destinado a colecciones como esa. Tenga en cuenta que una colección puede implementar tanto IList como IEnumerable (y muchos otros). Generalmente solo encuentras IEnumerable
como un parámetro de función, lo que significa que la función puede aceptar cualquier tipo de colección, porque todo lo que necesita es el modo de acceso más simple.
los IEnumerable
interfaz no incluye un indexador, probablemente lo esté confundiendo con IList
Si el objeto es realmente un IList
(p.ej List
o un array T[]
), intente hacer la referencia a él del tipo IList
también.
De lo contrario, puede utilizar myEnumerable.ElementAt(index)
que utiliza el método de extensión Enumerable.ElementAt. Esto debería funcionar para todos IEnumerable
s . Tenga en cuenta que a menos que el objeto (en tiempo de ejecución) implemente IList
esto hará que todos los primeros index + 1
artículos a enumerar, y todos menos el último se descartan.
EDITAR: Como explicación, IEnumerable
es simplemente una interfaz que representa “aquello que expone un enumerador”. Una implementación concreta bien puede ser algún tipo de lista en memoria que lo hace permitir el acceso rápido por índice, o puede que no. Por ejemplo, podría ser una colección que no puede satisfacer de manera eficiente dicha consulta, como una lista vinculada (como lo menciona James Curran). incluso puede ser ningún tipo de estructura de datos en memoria en absoluto, como un iterador, donde los elementos se generan (‘rendidos’) a pedido, o por un enumerador que obtiene los elementos de alguna fuente de datos remota. Porque IEnumerable
Debe admitir todos estos casos, los indexadores están excluidos de su definición.
Puedes usar Listar para convertir a una lista. Por ejemplo,
SomeItems.ToList()[1]