Iteradores (Guía de programación de C#)
Actualización: noviembre 2007
Un iterador es un método, descriptor de acceso get u operador que realiza una iteración personalizada sobre una matriz o clase de colección utilizando la palabra clave yield. La instrucción de retorno yield hace que un elemento de la secuencia de origen sea devuelto inmediatamente al llamador antes de obtener acceso al elemento siguiente de la secuencia de origen. Aunque un iterador se escribe como un método, el compilador lo traduce en una clase anidada que es, en realidad, una máquina de estados. Esta clase hace un seguimiento de la posición del iterador mientras continúe el bucle foreach del código cliente.
Nota: |
---|
Para ver lo que el compilador hace en segundo plano, utilice la herramienta ILDASM.exe que permite ver el código del lenguaje intermedio (IL) generado para un método iterador. |
Un iterador se invoca desde el código cliente mediante una instrucción foreach. Por ejemplo, puede crear un iterador para una clase que devuelve los elementos en orden inverso o que realiza una operación sobre cada elemento antes de que el iterador lo devuelva. Al crear un iterador para una clase o estructura, no tiene que implementar la interfaz IEnumerator completa. Cuando el compilador detecte el iterador, generará automáticamente los métodos Current, MoveNext y Dispose de la interfaz IEnumerator o IEnumerator<T>.
Información general sobre los iteradores
Un iterador es una sección de código que devuelve una secuencia ordenada de valores del mismo tipo.
Un iterador se puede utilizar como el cuerpo de un método, operador o descriptor de acceso get.
El código del iterador utiliza la instrucción yield return para devolver a su vez cada elemento. yield break finaliza la iteración.
Se pueden implementar varios iteradores en una clase. Cada iterador debe tener un nombre único, como cualquier miembro de clase, y se puede invocar mediante código cliente en una instrucción foreach de la manera siguiente: foreach(int x in SampleClass.Iterator2){}.
El tipo de valor devuelto de un iterador debe ser IEnumerable, IEnumerator, IEnumerable<T> o IEnumerator<T>.
Los iteradores son la base para el comportamiento de ejecución diferida en consultas de LINQ.
La palabra clave yield se utiliza para especificar el valor o los valores devueltos. Cuando se llega a la instrucción yield return, se almacena la ubicación actual. La ejecución se reinicia desde esta ubicación la próxima vez que se llame al iterador.
Los iteradores son especialmente útiles con las clases de colección, ya que proporcionan una manera fácil de recorrer en iteración estructuras de datos complejas, tales como los árboles binarios.
Secciones relacionadas
Para obtener más información:
Cómo: Crear un bloque de iteradores para una lista de enteros (Guía de programación de C#)
Cómo: Crear un bloque de iteradores para una lista genérica (Guía de programación de C#)
Ejemplo
En este ejemplo, la clase DaysOfTheWeek es una clase de colección simple que almacena los días de la semana como cadenas. Después de cada iteración de un bucle foreach, se devuelve la cadena siguiente de la colección.
public class DaysOfTheWeek : System.Collections.IEnumerable
{
string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < days.Length; i++)
{
yield return days[i];
}
}
}
class TestDaysOfTheWeek
{
static void Main()
{
// Create an instance of the collection class
DaysOfTheWeek week = new DaysOfTheWeek();
// Iterate with foreach
foreach (string day in week)
{
System.Console.Write(day + " ");
}
}
}
// Output: Sun Mon Tue Wed Thr Fri Sat
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
- 10,14 Iteradores