Lista Genérica Autonumérica (extended by Subgurim)

Muchos de vosotros ya conoceréis la enorme utilidad de las listas genéricas, nuevas en ASP.NET 2.0.

Como ya os comenté en su correspondiente artículo, fue comenzar a usarlas y no soltarlas... sin embargo en ocasiones surgen requerimientos que no pueden ser resueltos con las clases que vienen por defecto... y he aquí la gran utilidad de la herencia de clases

En esta ocasión, lo que yo quería era una lista genérica de las de siempre, pero con una variable autonumérica de la que no quería preocuparme más que para recoger el valor.

Dicho de otro modo, yo quiero una lista genérica, y asociado a cada Item que inserto en la lista, debe haber una variable entera "autonumeric" que se vaya incrementando en base a la variable "step" que indique y a partir del "seed" que inicialice... como podréis comprobar, es equivalente a lo que en las BBDD se le llama autonumérico, identity o similares.

Pues bien, resulta ser que implementar esto es tremendamente sencillo, y aquí tenéis el código:

using System;

namespace System.Collections.Generic
{
    /// <summary>
    /// Listado genérico autonumérico
    /// Autonumeric generic List
    /// </summary>
    public class AutonumericList<TValue> : Dictionary<int, TValue>
    {
        #region Propiedades
        // Autonumérico
        public int autonumeric = 1;

        private int _step = 1;
        /// <summary>
        /// Define el incremento del autonumérico. No puede valer 0.
       /// Defines the autonumeric increment
        /// </summary>
        private int step
        {
            get { return _step; }
            set
            {
                _step = value != 0 ? value : 1;
            }
        }

        #endregion

        #region Inicialización

        public AutonumericList()
            : this(1, 1)
        { }       

        public AutonumericList(int seed, int step)
        {
            this.autonumeric = seed;
            this.step = step;
        }

        #endregion

        #region 'Nuevas propiedades'
        public void Add(TValue value)
        {
            base.Add(autonumeric, value);
            autonumeric += step;
        }

        /// <summary>
        /// The first argument is ignored.
        /// El primer argumento es ignorado.
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public new void Add(int key, TValue value)
        {
            this.Add(value);
        }

        #endregion
    }
}


El quid de la cuestión está en heredar de la clase Dictionary, que consta de una clave (key) y un valor (value) genéricos. En este caso, obligamos a que la clave sea un entero, y será la que usaremos como autonumérico.

En cuanto al código:
  • Sólo defino dos propiedades (autonumeric y step), asegurándonos que el step no puede valer 0.
  • La inicialización es también muy simple. Si no indico nada, el primer autonumérico valdrá 1 y se incrementará de 1 en 1.
  • Lo más importante está en la función Add, que se encarga de añadir el valor que insertemos y crear el autonumérico correspondiente de forma automática. No hay ningún método (al menos que yo conozca y no sea demasiado difuso) para ocultar la función Add que añade la clave y el valor. Esta función es la que se usa en un Dictionary normal y corriente, solo que con nuestra AutonumericList no queremos que pueda cambiarse la Key (nuestro autonumérico).
Usar el AutonumericList es igualmente sencillo, por ejemplo:

        AutonumericList<string> listado = new AutonumericList<string>();

        for (int i = 0; i < 15; i++)
        {
            listado.Add(i.ToString());
        }

        listado.Add(5000, "Veremos que no se hace nada con el 5000");
       
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        foreach (KeyValuePair<int, string> kvp in listado)
        {
            sb.Append(kvp.Key);
            sb.Append("<br>");
        }
        Label1.Text = sb.ToString();


Espero que os sea útil para algo