using System; using System.Collections; namespace Articulos.Cap04 { // Representa a una persona con propiedades básicas: public class Persona { public String Nombre { get; set; } public String Apellido { get; set; } public Persona(string Nombre, string apellido) { this.Nombre = Nombre; this.Apellido = apellido; } } // Estructura de datos Gente: public class Gente : IEnumerable { // Conjunto de personas: private Persona[] personas; public Gente(Persona[] personas) { this.personas = new Persona[personas.Length]; for (int i = 0; i < personas.Length; ++i) { this.personas[i] = personas[i]; } } // Implementación explícita de GetEnumerator de IEnumerable: IEnumerator IEnumerable.GetEnumerator() { return (IEnumerator) GetEnumerator(); } public GenteEnum GetEnumerator() { return new GenteEnum(personas); } } // Enumerador de los elementos de la estructura Gente: public class GenteEnum : IEnumerator { public Persona[] gente; // El índice de los enumeradors empieza en la ubicación // anterior al primer elemento de la estructura: int posicion = -1; public GenteEnum(Persona[] gente) { this.gente = gente; } // Implementa la propiedad Current para obtener el elemento // actual de la colección: object IEnumerator.Current { get { return Current; } } public Persona Current { get { try { return gente[posicion]; } catch (IndexOutOfRangeException) { throw new InvalidOperationException(); } } } // Implementación del método MoveNext() para validar el avance // al siguiente elemento de la estructura de datos: public bool MoveNext() { ++posicion; return ( posicion < gente.Length); } // Implementación del método Reset para reestablecer // el enumerador en la posición inicial: public void Reset() { posicion = -1; } } public sealed class UsoEnumeradores { public static void Main() { // Listado de personas: Persona[] personas = new Persona[3] { new Persona("Edward", "Ortiz"), new Persona("German", "Ortiz"), new Persona("Daniela", "Ortiz") }; Gente gente = new Gente(personas); // Recorrido por los elementos de la estructura // de personas (Gente): foreach (Persona p in gente) { Console.WriteLine ("Nombre: {0}, Apellido: {1}", p.Nombre, p.Apellido); } } } }