Usando iteradores (guia de programação de C#)
A maneira mais comum para criar um iterador é implementar a GetEnumerator método o IEnumerable interface, por exemplo:
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < 10; i++)
{
yield return i;
}
}
A presença da GetEnumerator método torna o tipo de um tipo enumerable e permite usar o foreach instrução. Se o método acima fazia parte de uma definição de classe para ListClass, em seguida, seria possível usar foreach na classe assim:
static void Main()
{
ListClass listClass1 = new ListClass();
foreach (int i in listClass1)
{
System.Console.Write(i + " ");
}
// Output: 0 1 2 3 4 5 6 7 8 9
}
O foreach instrução chama ListClass.GetEnumerator() e usa o enumerador retornado para iterar por meio de valores. Para obter um exemplo de como criar um iterador genérico que retorna um IEnumerator<T> interface, consulte How to: Criar um iterador Bloco para uma genérica Lista (guia de programação C#).
Também é possível usar os iteradores nomeados para oferecer suporte a diferentes maneiras de iteração do mesmo conjunto de dados. Por exemplo, você poderia fornecer um iterador que retorna os elementos em ordem crescente e um retorna os elementos em ordem decrescente. Um iterador também pode ter parâmetros para ativar o controle de todos os clientes ou parte do comportamento de iteração. A seguir implementa o iterador a IEnumerable interface usando o iterador nomeado SampleIterator:
// Implementing the enumerable pattern
public System.Collections.IEnumerable SampleIterator(int start, int end)
{
for (int i = start; i <= end; i++)
{
yield return i;
}
}
O iterador nomeado é chamado assim:
ListClass test = new ListClass();
foreach (int n in test.SampleIterator(1, 10))
{
System.Console.Write(n + " ");
}
// Output: 1 2 3 4 5 6 7 8 9 10
Você pode usar mais de uma rendimento a instrução no mesmo iterador como no exemplo a seguir:
public System.Collections.IEnumerator GetEnumerator()
{
yield return "With an iterator, ";
yield return "more than one ";
yield return "value can be returned";
yield return ".";
}
Você pode imprimir os resultados usando o seguinte foreach instrução:
foreach (string element in new TestClass())
{
System.Console.Write(element);
}
// Output: With an iterator, more than one value can be returned.
Este exemplo exibe o texto a seguir:
With an iterator, more than one value can be returned.
Em cada iteração sucessiva de foreach loop (ou a chamada direta para IEnumerator.MoveNext), o corpo de código do iterador próximo continua após o anterior yield instrução e continua a Avançar até o final do corpo do iterador for alcançado ou uma yield break instrução é encontrada.
Iteradores não oferecem suporte a IEnumerator.Reset método. Para re-iterate desde o início, você deve obter um iterador de novo.
Exemplo
O código a seguir contém todos os exemplos neste tópico.
namespace UsingIterators
{
class Program
{
static void Main()
{
// Using a simple iterator.
ListClass listClass1 = new ListClass();
foreach (int i in listClass1)
{
System.Console.Write(i + " ");
}
// Output: 0 1 2 3 4 5 6 7 8 9
System.Console.WriteLine();
// Using a named iterator.
ListClass test = new ListClass();
foreach (int n in test.SampleIterator(1, 10))
{
System.Console.Write(n + " ");
}
// Output: 1 2 3 4 5 6 7 8 9 10
System.Console.WriteLine();
// Using multiple yield statements.
foreach (string element in new TestClass())
{
System.Console.Write(element);
}
// Output: With an iterator, more than one value can be returned.
System.Console.WriteLine();
}
}
class ListClass : System.Collections.IEnumerable
{
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < 10; i++)
{
yield return i;
}
}
// Implementing the enumerable pattern
public System.Collections.IEnumerable SampleIterator(int start, int end)
{
for (int i = start; i <= end; i++)
{
yield return i;
}
}
}
class TestClass : System.Collections.IEnumerable
{
public System.Collections.IEnumerator GetEnumerator()
{
yield return "With an iterator, ";
yield return "more than one ";
yield return "value can be returned";
yield return ".";
}
}
}
Consulte também
Tarefas
How to: Criar um iterador Bloco para obter uma Lista de inteiros (C# guia de programação)
How to: Criar um iterador Bloco para uma genérica Lista (guia de programação C#)
Referência
O uso de foreach com matrizes (guia de programação C#)