Utilizar iteradores (Guía de programación de C#)
Actualización: noviembre 2007
La manera más común de crear un iterador es implementar el método GetEnumerator en la interfaz IEnumerable, por ejemplo:
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < 10; i++)
{
yield return i;
}
}
La presencia del método GetEnumerator transforma el tipo en un tipo enumerable y permite utilizar la instrucción foreach. Si el método anterior formaba parte de una definición de clase para ListClass, sería posible utilizar foreach en la clase de la forma siguiente:
static void Main()
{
ListClass listClass1 = new ListClass();
foreach (int i in listClass1)
{
System.Console.WriteLine(i);
}
}
La instrucción foreach invoca al método ListClass.GetEnumerator() y utiliza el enumerador que devuelve para recorrer en iteración los valores. Para obtener un ejemplo de cómo crear un iterador genérico que devuelve una interfaz IEnumerator<T>, vea Cómo: Crear un bloque de iteradores para una lista genérica (Guía de programación de C#).
También es posible utilizar iteradores con nombre para admitir maneras diferentes de recorrer en iteración la misma colección de datos. Por ejemplo, podría proporcionar un iterador que devuelve los elementos en orden ascendente y otro que los devuelve en orden descendente. Un iterador también puede tener parámetros que permitan a los clientes controlar todo o parte del comportamiento de iteración. El iterador siguiente implementa la interfaz IEnumerable utilizando el iterador con nombre SampleIterator:
// Implementing the enumerable pattern
public System.Collections.IEnumerable SampleIterator(int start, int end)
{
for (int i = start; i <= end; i++)
{
yield return i;
}
}
El iterador con nombre se invoca de este modo:
ListClass test = new ListClass();
foreach (int n in test.SampleIterator(1, 10))
{
System.Console.WriteLine(n);
}
Se puede utilizar más de una instrucción yield en el iterador como se muestra en el ejemplo siguiente:
public System.Collections.IEnumerator GetEnumerator()
{
yield return "With an iterator, ";
yield return "more than one ";
yield return "value can be returned";
yield return ".";
}
Se pueden imprimir los resultados con la siguiente instrucción foreach:
foreach (string element in new TestClass())
{
System.Console.Write(element);
}
Este ejemplo muestra el texto siguiente:
With an iterator, more than one value can be returned.
En cada iteración sucesiva del bucle foreach (o llamada directa a IEnumerator.MoveNext), el cuerpo del código del iterador siguiente se reanuda después de la instrucción yield anterior y continúa a la siguiente hasta que se llega al final del cuerpo del iterador o se encuentra una instrucción yield break.
Los iteradores no admiten el método IEnumeratorReset(). Para volver a recorrer en iteración desde el principio, debe obtener un nuevo iterador.
Vea también
Tareas
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#)