Exportar (0) Imprimir
Expandir Tudo
Este tópico ainda não foi avaliado como - Avalie este tópico

Como: Acessar a Classe coleção com foreach (Guide Programming C#)

The seguinte Código Exemplo illustrates How to Gravar a classe coleção non-Genérico that can be used com foreach.The classe is a Tokenizer Cadeia de Caracteres, similar to the executar C-tempo função strtok_s.

ObservaçãoObservação:

HIS exemplo represents Practice recommeonded only in cases WHERE You Cannot Use a genérico classe coleção.genéricos are com suporte in versão 2.0 and later of the C# Idioma and the .NET Framework.Para um exemplo de como para implementar um tipo-Safe genérico classe coleção que suporta IEnumerable<T> e assim evita os Questões discutidos abaixo, consulte Como: Criar an Bloquear Iterator for a Lista Genérico (C# Programming Guide).

No seguinte exemplo, Tokens quebras a frase "This is uma sentença exemplo." em tokens usando ' ' e '-' como separadores e enumera os símbolos com a instrução foreach:

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

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


Internally, Tokens uses an matriz, which Implements IEnumerator and IEnumerable itself.The exemplo de código could have Used Métodos 's the matriz enumeração as its own, but that would have Defeated the Purpose of this exemplo.

In C#, it não é necessary strictly for a classe coleção to Inherit from IEnumerable and IEnumerator in ordem to be compatível with foreach; as long as the classe has the exigido GetEnumerator, MoveNext, Reset, and Membros Current , it will trabalho com foreach.Omitting the interfaces has the advantage of allowing you to Definir the tipo de retorno of Current to be specific Mais than object, Thereby Providing Type-Safety.

For exemplo, Starting com the Código exemplo above, Alterar the seguinte 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  

Now, because Current returns a Cadeia de Caracteres, the compilador can detecção when an incompatível tipo is used in a instrução foreach:

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

The disadvantage of omitting IEnumerable and IEnumerator is that the classe coleção é não interoperable longer with the Statements foreach, or equivalents, of Outro Comummon Language Tempo de execução-Comumpatível LANGUAGES.

You can have the best of Ambos tipo-Safety within C# and interoperabilidade with Outro Comummon Language Tempo de execução, worlds-Comumpatível Languages, by inheriting from IEnumerable and IEnumerator and Using EXPLICIT interface implementação as demonstrated in the seguinte 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);
        }
    }
}


This is a sample sentence.
Isso foi útil para você?
(1500 caracteres restantes)
Agradecemos os seus comentários

Contribuições da comunidade

ADICIONAR
Mostrar:
© 2014 Microsoft. Todos os direitos reservados.