Después de investigar con expertos en la materia, programadores de varias ramas y profesores hemos dado con la respuesta a la cuestión y la dejamos plasmada en este post.
Solución:
Depende de lo que entiendas por “eso”. El iterador sabe qué índice ha alcanzado, sí, en el caso de un List
o un array. Pero no hay un índice general dentro IEnumerator
. Ya sea que esté iterando sobre una colección indexada o no, depende de la implementación. Muchas colecciones no admiten la indexación directa.
(En realidad, foreach
no siempre usa un iterador en absoluto. Si el tipo de tiempo de compilación de la colección es un arrayel compilador iterará sobre él usando array[0]
, array[1]
etc. Asimismo, la colección puede tener un método llamado GetEnumerator()
que devuelve un tipo con los miembros apropiados, pero sin ninguna implementación de IEnumerable
/IEnumerator
visión.)
Opciones para mantener un índice:
- Utilizar una
for
círculo - Usar una variable separada
-
Use una proyección que proyecte cada elemento a un par índice/valor, por ejemplo
foreach (var x in list.Select((value, index) => new value, index )) // Use x.value and x.index in here
-
Usa mi
SmartEnumerable
clase que es un poco como la opción anterior
Todas menos la primera de estas opciones funcionarán ya sea que la colección esté indexada naturalmente o no.
Usar for
en vez de foreach
. foreach
no expone su funcionamiento interno, enumera todo lo que es IEnumerable
(que no tiene que tener un índice en absoluto).
for (int i=0; i
Además, si lo que intenta hacer es encontrar el índice de un elemento en particular en la lista, no tiene que iterarlo en absoluto. Usar Array.IndexOf(item)
en cambio.
tu comprensión de foreach
está incompleto.
Funciona con cualquier tipo que exponga IEnumerable
(o implementa un GetEnumerable
método) y utiliza el devuelto IEnumerator
para iterar sobre los elementos de la colección.
Cómo Enumerator
hace esto (usando un índice, yield
declaración o magia) es un detalle de implementación.
Para lograr lo que quieres, debes usar un for
círculo:
for (int i = 0; i < mylist.Count; i++)
Nota:
Obtener la cantidad de elementos en una lista es ligeramente diferente según el tipo de lista
For Collections: Use Count [property]
For Arrays: Use Length [property]
For IEnumerable: Use Count() [Linq method]
Reseñas y calificaciones
Si te ha sido de utilidad este artículo, sería de mucha ayuda si lo compartieras con el resto programadores de esta forma contrubuyes a extender este contenido.