Como crear una coleccion de clases específicas

A veces hemos necesitado almacenar varios elementos de un tipo no estándar de .NET en alguna colección o arreglo. Hay alternativas que no son las mas ideales, pero que funcionan, como utilizar el objeto ArrayList o definir un arreglo de algún tamaño.Utilizar un ArrayList es muy fácil, pero lo que hace es crear un arreglo de objetos que debemos convertir al tipo necesario. Esta conversión la hace realizando una copia a otro arreglo. Este proceso es lento y consumidor de recursos.Utilizar un arreglo tiene sus ventajas y desventajas. Es evidente que manejar el tipo específico evita tener que hacer conversiones de tipos, pero también definir un arreglo de un tamaño específico nos puede hacer perder recursos (si es mas grande de lo que necesitamos) como también la necesidad de extenderlo si se queda chico.En este artículo veremos como construir una colección de clases específicas. La solución no es la óptima, pero es mejor que las dos anteriores. No es optima por que igual se utiliza “por debajo” una colección de objetos, pero la transformación es mas limpia y menos costosa en recursos. La solución óptima la tendremos en Whidbey, con la inclusión de Generics.

En los ejemplos se utilizará C#, pero la implementación de la colección se hará en tanto en C# como VB.


Veamos el siguiente ejemplo para una clase Documento, que contiene una colección de elementos de tipo Linea. En este caso, la clase específica que queremos convertir en colección es Linea.


Nuestra clase Linea esta definida de la siguiente forma. Tiene una propiedad de texto, con el valor.


public class Linea
{
   
private string _strValor = string.Empty;

    public Linea(string strValor)
    {
       
this._strValor = strValor;
    }
    public string Valor
    {
       
get { return this._strValor; }
    }
}

Para crear una colección de clases específicas, debe crear una nueva clase que herede de System.Collections.CollectionBase y crear los métodos para poder insertar, remover y acceder a los elementos de la colección. La clase base posee un método para remover (RemoveAt) pero que no hace validación de índices al ejecutarse. La clase de colección queda de la siguiente forma.


public class LineaCollection : System.Collections.CollectionBase
{

    public void Add(Linea objLinea)
    {
       
this.List.Add(objLinea);
    }
    public void Remove(int index)
    {
       
if (index <= Count – 1 || index >= 0)
        {
           
this.List.RemoveAt(index);
        }
    }
    public Linea this[int index]
    {
       
get { return ((Linea) (this.List[index])); }
       
set { this.List[index] = value; }
    }
}

¿Como queda nuestra clase Documento?. La propiedad Lineas es de sólo lectura ya que esta entrega la referencia al arreglo, y una vez con la referencia los cambios que se hagan en el arreglo persisten igual.


public class Documento
{
   
private string _strNombre = string.Empty;
   
private LineaCollection _objLineas = null;

    public Documento(string strNombre)
    {
       
this._strNombre = strNombre;
       
this._objLineas = new LineaCollection();
    }
    public LineaCollection Lineas
    {
       
get { return this._objLineas; }
    }
}

En un pequeño ejemplo de uso, creamos un documento, agregamos líneas y después las recorremos con un enumerador.

internal class Demo
{
    public Demo()
    {
        Documento _objDocumento = new Documento(“mi documento de prueba”);
        Linea _objLinea =
null;
        _objDocumento.Lineas.Add(new Linea(“linea 1″));
        _objLinea = new Linea(“Linea 2″);
        _objDocumento.Lineas.Add(_objLinea);
        foreach (Linea _objTemp in _objDocumento.Lineas)
        {
            System.Diagnostics.Debug.Write(_objTemp.Valor);
        }
    }
}

Por último, la misma colección, pero definida en VB.NET queda de la siguiente forma.

Public Class LineaCollection
    Inherits CollectionBase
    Public Sub Add(ByVal objLinea As Linea)
       
Me.List.Add(objLinea)
   
End Sub
    Public Sub Remove(ByVal index As Integer)
       
If index <= Count – 1 OrElse index >= 0 Then
            Me.List.RemoveAt(index)
       
End If
    End Sub
    Public Property Item(ByVal index As Integer) As Linea
       
Get
            Return CType(Me.List.Item(index), Linea)
       
End Get
        Set(ByVal Value As Linea)
           
Me.List.Item(index) = Value
       
End Set
    End Property

End Class

3 thoughts on “Como crear una coleccion de clases específicas”

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>