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
Referência
Matrizes (Guia de programação do C#)
Classes coleção (guia de programação C#)