Como: acesso uma classe de coleção com foreach (guia de programação translation from VPE for Csharp)

O exemplo de código a seguir ilustra como escrever uma classe de coleção não genéricas que pode ser usada com foreach.A classe é uma seqüência de caracteres tokenizer, semelhante a função de time de execução C strtok_s.

Observação:

T o exemplo representa apenas a prática recomendada Quando não é possível usar uma classe de coleção genérica.Classes genéricas têm suporte no versão 2.0 e posteriores da linguagem translation from VPE for Csharp e o .NET estrutura.Para obter um exemplo de como implementar uma classe de coleção genérica de fortemente tipado que oferece suporte IEnumerable<T>e, assim, evita os problemas discutidos neste tópico, consulte Como: Criar um bloco iterador para uma lista genérica (guia de programação translation from VPE for Csharp).

No exemplo a seguir, Tokensdivide a frase "Esta é uma frase de exemplo." em tokens usando ' ' e '-' sistema autônomo separadores e enumera sistema autônomo tokens com o foreach demonstrativo:

Tokens f = new Tokens("This is a sample sentence.", new char[] {' ','-'});

foreach (string item in f)
{
    System.Console.WriteLine(item);
}

Internamente, Tokens utiliza uma matriz, que implementa IEnumerator e IEnumerable propriamente dito. O exemplo de código poderia ter usado métodos de enumeração da matriz sistema autônomo seu próprio, mas teria que ter vencido a finalidade deste exemplo.

Em translation from VPE for Csharp, não é absolutamente necessário para uma classe de coleção herdar de IEnumerable e IEnumerator para ser compatível com o foreach. Desde que a classe tem o necessáriaGetEnumerator, MoveNext, Reset, e Current membros, ele funcionará com foreach. Omitir as interfaces tem a vantagem de permitindo que você defina o tipo de retorno de Current ser mais específico que Object, que fornece segurança de tipos.

Por exemplo, começando com o código de exemplo anteriormente neste tópico, altere as seguintes linhas:

// No longer inherits from IEnumerable:
public class Tokens  
// Doesn't return an IEnumerator:
public TokenEnumerator GetEnumerator()  
// No longer inherits from IEnumerator:
public class TokenEnumerator  
// Type-safe: returns string, not object:
public string Current  

Agora, pois Current Retorna uma seqüência de caracteres, o compilador pode detectar quando um tipo incompatível é usado em um foreach demonstrativo:

// Error: cannot convert string to int:
foreach (int item in f)  

A desvantagem de omissão de IEnumerable e IEnumerator é que a classe de coleção não é interoperável com o foreach instruções ou equivalentes, outras Common Language tempo de execução-idiomas compatível.

Você pode ter o melhor de ambos sistema autônomo mundos, segurança de tipos em translation from VPE for Csharp e interoperabilidade com outras linguagens de compatível com o tempo de execução de linguagem comum, por herança de IEnumerable e IEnumerator e usando a implementação explícita da interface sistema autônomo demonstrado no exemplo a seguir.

Exemplo

using System.Collections;

// Declare the Tokens class:
public class Tokens : IEnumerable
{
    private string[] elements;

    Tokens(string source, char[] delimiters)
    {
        // Parse the string into tokens:
        elements = source.Split(delimiters);
    }

    // IEnumerable Interface Implementation:
    //   Declaration of the GetEnumerator() method 
    //   required by IEnumerable
    public IEnumerator GetEnumerator()
    {
        return new TokenEnumerator(this);
    }


    // Inner class implements IEnumerator interface:
    private class TokenEnumerator : IEnumerator
    {
        private int position = -1;
        private Tokens t;

        public TokenEnumerator(Tokens t)
        {
            this.t = t;
        }

        // Declare the MoveNext method required by IEnumerator:
        public bool MoveNext()
        {
            if (position < t.elements.Length - 1)
            {
                position++;
                return true;
            }
            else
            {
                return false;
            }
        }

        // Declare the Reset method required by IEnumerator:
        public void Reset()
        {
            position = -1;
        }

        // Declare the Current property required by IEnumerator:
        public object Current
        {
            get
            {
                return t.elements[position];
            }
        }
    }


    // Test Tokens, TokenEnumerator
    static void Main()
    {
        // Testing Tokens by breaking the string into tokens:
        Tokens f = new Tokens("This is a sample sentence.", new char[] {' ','-'});

        foreach (string item in f)
        {
            System.Console.WriteLine(item);
        }
    }
}
/* Output:
    This
    is
    a
    sample
    sentence.  
*/

Consulte também

Conceitos

Guia de Programação C#

Referência

Matrizes (Guia de programação do C#)

Classes coleção (guia de programação C#)

System.Collections.Generic

Outros recursos

Referência C#