CÓMO: Implementar colecciones personalizadas en C#.NET


Para obtener una versión de Microsoft Visual Basic .NET de este artículo, consulte 306961 .



Para obtener una versión de Microsoft Visual C++ .NET de este artículo, consulte 312514 .

En esta tarea

Resumen

En este artículo se explica cómo implementar una colección personalizada en Visual C# .NET. Las bibliotecas de clases de base de .NET Framework ofrecen una definición formal de una colección: la interfaz System.Collections.ICollection.


Implementar la interfaz ICollection en una clase personalizada

La interfaz ICollection se hereda de la interfaz IEnumerable. La interfaz ICollection define un método CopyTo y tres propiedades de sólo lectura: IsSynchronized, SyncRoot y Count. ICollection hereda el método GetEnumerator de la interfaz IEnumerable. Una clase de colección personalizada debe implementar la interfaz ICollection.


Para implementar la interfaz ICollection, siga estos pasos:
  1. En Visual C# .NET, cree una aplicación de Windows.
  2. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el nombre de proyecto y, después, haga clic en Agregar clase para agregar un módulo de clase.
  3. Importe el espacio de nombres System.Collection. Para ello, escriba
    using System.Collections
    en la primera línea del módulo de clase.
  4. Pegue el código siguiente en el módulo de clase después del espacio de nombres <NombreDeProyecto> y la instrucción {:
     
    public class CustomCollection : Icollection
    {

    private int[] intArr = {1,5,9};
    private int Ct;

    public CustomCollection()
    {
    Ct=3;
    }
    }
    Por simplificar, la clase de colección contiene una matriz de enteros donde se almacenan los elementos enteros que se inicializan con tres enteros y una variable de número Ct que se configura como 3.


  5. Por simplificar, la clase de colección contiene una matriz de enteros donde se almacenan los elementos enteros que se inicializan con tres enteros y una variable de número Implemente el método CopyTo, que toma como parámetros una matriz Integer y un índice. Este método copia los elementos de una colección a la matriz, empezando en el índice que se transfiere. Para implementar este método, pegue el código siguiente después del constructor público CustomCollection:
    void ICollection.CopyTo(Array myArr, int index)
    {

    foreach (int i in intArr)
    {
    myArr.SetValue(i,index);
    index = index+1;
    }

    }
  6. Por simplificar, la clase de colección contiene una matriz de enteros donde se almacenan los elementos enteros que se inicializan con tres enteros y una variable de número Implemente el método GetEnumerator, heredado por ICollection de IEnumerable. El método GetEnumerator devuelve un objeto que implementa la interfaz IEnumerable. Para implementar este método, pegue el código siguiente después del método CopyTo:
    IEnumerator IEnumerable.GetEnumerator()
    {
    return new Enumerator(intArr);
    }
  7. Por simplificar, la clase de colección contiene una matriz de enteros donde se almacenan los elementos enteros que se inicializan con tres enteros y una variable de número Para implementar las tres propiedades de sólo lectura, pegue el código siguiente después del método GetEnumerator:
    //La propiedad Boolean IsSynchronized devuelve True si la 
    //colección está diseñada para subprocesos seguros; de lo contrario, devuelve False.
    bool ICollection.IsSynchronized
    {
    get
    {
    return false;
    }
    }

    //La propiedad SyncRoot devuelve un objeto, que se utiliza para
    //sincronizar la colección. Esto devuelve la instancia del objeto o la propiedad
    //SyncRoot de otras colecciones si la colección contiene otras colecciones.
    //
    objeto ICollection.SyncRoot
    {
    get
    {
    return this;
    }
    }

    //La propiedad Count de sólo lectura devuelve el
    //número de elementos de la colección.
    int ICollection.Count
    {
    get
    {
    return Ct;
    }
    }

Implementar un objeto enumerador para el método GetEnumerator

  1. Cree una clase Enumerator para permitir la enumeración de la clase CustomCollection. Para ello, pegue el código siguiente después de la instrucción } para la clase CustomCollection en el módulo de clase:
    public class Enumerator : Ienumerator
    {
    private int[] intArr;
    private int Cursor;
    }
    Declare la matriz de enteros privada intArr de manera que contenga los elementos de la clase CustomCollection cuando se llame al método GetEnumerator. El miembro de campo Cursor contiene la posición actual durante la enumeración.


  2. Declare la matriz de enteros privada Agregue un constructor con intArr como parámetro y configure la matriz local intArr como este valor. Pegue el código siguiente después de la declaración del campo miembro:
    public Enumerator(int[] intarr)
    {
    this.intArr = intarr;
    Cursor = -1;
    }
  3. Declare la matriz de enteros privada Implemente los métodos Reset y MoveNext. Para ello, pegue el código siguiente después del constructor:
    void IEnumerator.Reset()
    {
    Cursor = -1;
    }
    bool IEnumerator.MoveNext()
    {
    if (Cursor < intArr.Length)
    Cursor++;

    return(!(Cursor == intArr.Length));
    }
    Reset configura el cursor como -1 y MoveNext lleva el cursor al elemento siguiente. MoveNext devuelve True si funciona correctamente.


  4. Declare la matriz de enteros privada Implemente la propiedad Current de sólo lectura que devuelve el elemento señalado por el cursor. Si el cursor es -1, generará una InvalidOperationException. Pegue el código siguiente después del método MoveNext:
    object IEnumerator.Current
    {
    get
    {
    if((Cursor < 0) || (Cursor == intArr.Length))
    throw new InvalidOperationException();
    return intArr[Cursor];
    }
    }

Utilizar For Each para establecer una iteración por la colección personalizada

  1. Arrastre un botón en el formulario; para ello, haga clic en Form1.cs[design] y arrastre un botón desde el cuadro de herramientas hasta el formulario.
  2. Haga doble clic en el botón y agregue el código siguiente al evento Click del botón:
        CustomCollection MyCol = new CustomCollection();

    foreach (object MyObj in MyCol)
    MessageBox.Show(MyObj.ToString());
  3. Presione F5 para ejecutar la aplicación y haga clic en el botón. Tenga en cuenta que un cuadro de mensajes muestra los elementos de la colección personalizada.
¿Cómo funciona? For Each llama al método GetEnumerator para crear el objeto Enumerator y llama al método MoveNext para situar el cursor en el primer elemento. Después se tiene acceso a la propiedad Current para obtener el elemento de MyObj. Esto se repite hasta que MoveNext devuelve False.


Propiedades

Id. de artículo: 307484 - Última revisión: 9 abr. 2003 - Revisión: 1

Comentarios