Glosario del enumerador de C#
Si está creando una clase que se comporta como una colección, puede ser conveniente permitir a los usuarios de la clase enumerar los miembros de la colección usando una declaración foreach. Esto es más fácil de lograr en C# 2.0 que en C# 1.1. Como demostración, primero agregamos una enumeración a una colección simple en C# 1.1 y luego modificamos este ejemplo para usar el nuevo constructor de enumeración de C# 2.0.
Comenzaremos creando un cuadro de lista simplificado que contendrá una matriz de 8 cadenas y un número entero para registrar cuántas cadenas se han agregado a la matriz. El constructor inicializará la matriz y la completará con los parámetros pasados.
Cuadro de lista pública (cadena de parámetros[] cadenas iniciales)
{
cadenas = nueva cadena[8];
foreach( Cadena s en cadenas iniciales)
{
cadenas[ctr++]= s;
}
}
Además, la clase ListBox requiere un método add (agrega una cadena) y un método que devuelve el número de cadenas en la matriz.
Public void Add(string theString)
{
cadenas[CTR]= la cadena;
ctr++;
}
public int GetNumEntries()
{
Return ctr
}
Nota: En el desarrollo real, generalmente se usa ArrayList en lugar de matrices de tamaño fijo. Aquí, por simplicidad, no se realiza la detección de subíndices de matriz fuera de límites.
En cierto sentido, listBox es como una colección. Sería muy conveniente si pudieras usar el bucle foreach comúnmente usado en las colecciones para obtener todas las cadenas en ListBox. En este caso puedes escribir el código así:
ListBox lb = new ListBox(a, b, c, d, e, f, g, h);
foreach( Cadena en puntos){
Consola. Escribe línea;
}
Sin embargo, obtienes un error como este:
"Iterator.ListBox" no contiene una definición pública para "GetEnumerator", entonces la declaración foreach no se puede aplicar a variables de tipo "Iterador". Cuadro de lista".
Para usar la declaración foreach, también debe implementar la interfaz IEnumerable.
Esta interfaz solo necesita implementar un método: GetEnumerator. Este método debe devolver un objeto que implementa la interfaz IEnumerator Además, el objeto que necesitamos devolver no solo implementa IEnumerator, sino que también sabe cómo enumerar objetos ListBox. Debe crear un ListBoxEmunerator (como se describe a continuación):
Nota: IEnumerable. e IEnumerator son interfaces diferentes, por favor no Confusión
IEnumerator público GetEnumerator()
{
Devuelve un nuevo enumerador de cuadro de lista();
}
Ahora, ListBox puede usar el bucle foreach:
ListBox lbt = new ListBox(Hello, World
add(who); p>
lbt.add(yes);
lbt.add(john);
lbt.add(Galt);
foreach(cadena en lbt s)
{
Consola.
WriteLine(value: {0}, s);
}
Primero, cree una instancia del ListBox, inicialice dos cadenas y luego agregue cuatro cadenas más. El bucle foreach acepta una instancia de ListBox y la itera, devolviendo cadenas a su vez. El resultado es:
Hola
Mundo
Quién
es
John
Galt