Saltar al contenido

Contador en bucle foreach en C#

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *