// ===++=== // // OrtizOL // // ===--=== /*============================================================ // // Clase: NuevaListaGenerica.cs // // Propósito: Demostrar la creción de un tipo genérico // personalizado. // ============================================================*/ using System; using System.Collections.Generic; namespace Articulos.Cap03 { /// /// Tipo genérico ListaGenerica. /// T es el parámetro de tipo. /// internal class ListaGenerica { /// /// La clase anidada `Nodo` también accede al parámetro de tipo `T`. /// private class Nodo { // Contiene referencia al siguiente nodo: private Nodo siguiente; // Propiedad para recuperar y establecer el nodo siguiente: public Nodo Siguiente { get { return siguiente; } set { siguiente = value; } } // Dato del nodo actual (de tipo `T`): private T valor; // Propiedad para recuperar y establecer el valor del nodo actual: public T Valor { get { return valor; } set { valor = value; } } /// /// El constructor con 1-argumento usa el parámetro de tipo `T`. /// public Nodo(T t) { siguiente = null; valor = t; } } // Campo para referirse a la cabeza de la lista: private Nodo cabeza; // Al crear la lista la cabeza de lista no tiene // asignado ningún valor. public ListaGenerica() { cabeza = null; } /// /// Agrega un nuevo elemento de tipo T a la lista. /// public void Agregar(T t) { Nodo n = new Nodo(t); n.Siguiente = cabeza; cabeza = n; } public IEnumerator GetEnumerator() { Nodo actual = cabeza; while (actual != null) { yield return actual.Valor; actual = actual.Siguiente; } } } internal class PruebaNuevaListaGenerica { public static void Main() { // Creamos una lista con tipos enteros (int): ListaGenerica listaEnteros = new ListaGenerica(); // Agrega a a lista `listaEnteros` números en el rango 0-9: for (int x = 0; x < 10; ++x) { listaEnteros.Agregar(x); } // Itera a través del contenido de la lista: Console.WriteLine("\nContenido de `listaEnteros`:"); foreach(int numero in listaEnteros) { Console.WriteLine("\t{0}", numero.ToString()); } Console.WriteLine(); } } }