Share via


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

rendimento (referência de C#)

O uso de foreach com matrizes (guia de programação C#)

foreach, (C# Reference)

Conceitos

C# Programming Guide