// ===++===
//
// 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
{
///<summary>
/// Tipo genérico ListaGenerica.
/// T es el parámetro de tipo.
///</summary>
internal class ListaGenerica<T>
{
///<summary>
/// La clase anidada `Nodo` también accede al parámetro de tipo `T`.
///</summary>
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;
}
}
///<summary>
/// El constructor con 1-argumento usa el parámetro de tipo `T`.
///<summary>
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;
}
///<summary>
/// Agrega un nuevo elemento de tipo T a la lista.
///</summary>
public void Agregar(T t)
{
Nodo n = new Nodo(t);
n.Siguiente = cabeza;
cabeza = n;
}
public IEnumerator<T> 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<int> listaEnteros = new ListaGenerica<int>();
// 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();
}
}
}