Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo paso a paso se muestra cómo implementar una colección personalizada en Visual C#. Las bibliotecas de clases base de Microsoft .NET Framework ofrecen una definición formal de una interfaz de colección System.Collections.ICollection .
Versión original del producto: Visual C#
Número de KB original: 307484
Implementación de la interfaz ICollection en una clase personalizada
La interfaz ICollection hereda de la interfaz IEnumerable . La ICollection interfaz define un CopyTo método y tres propiedades de solo lectura: IsSynchronized, SyncRooty Count. ICollection hereda el GetEnumerator método de la IEnumerable interfaz . Una clase de colección personalizada debe implementar la ICollection interfaz .
Para implementar la ICollection interfaz, siga estos pasos:
En Visual C# .NET, cree una aplicación de Windows.
En Explorador de soluciones, haga clic con el botón derecho en el nombre del proyecto, seleccione Agregar y, a continuación, haga clic en Agregar clase para agregar un módulo de clase denominado CustomCollection.
Agregue el código de ejemplo siguiente al principio del módulo de clase para importar el
System.Collectionespacio de nombres:using System.Collections;Reemplace cualquier otro código del módulo por el código de ejemplo siguiente:
public class CustomCollection : ICollection { private int[] intArr = {1,5,9}; private int Ct; public CustomCollection() { Ct=3; } }Para simplificar, la
CustomCollectionclase contiene una matriz con tres elementos enteros y una variable count.Implemente el
CopyTométodo , que toma una matriz de enteros y un índice como parámetros. Este método copia los elementos de una colección en la matriz a partir del índice que se pasa. Para implementar este método, pegue el código siguiente después del constructor públicoCustomCollection:void ICollection.CopyTo(Array myArr, int index) { foreach (int i in intArr) { myArr.SetValue(i,index); index = index+1; } }Implemente el
GetEnumeratormétodo , que hereda laICollectioninterfaz deIEnumerable. ElGetEnumeratormétodo devuelve unEnumeratorobjeto que puede recorrer en iteración una colección. Pegue el código de ejemplo siguiente después delCopyTométodo :IEnumerator IEnumerable.GetEnumerator() { return new Enumerator(intArr); }Para implementar las tres propiedades de solo lectura, pegue el código siguiente después del
GetEnumeratormétodo :// The IsSynchronized Boolean property returns True if the // collection is designed to be thread safe; otherwise, it returns False. bool ICollection.IsSynchronized { get { return false; } } // The SyncRoot property returns an object, which is used for synchronizing // the collection. This returns the instance of the object or returns the // SyncRoot of other collections if the collection contains other collections. object ICollection.SyncRoot { get { return this; } } // The Count read-only property returns the number // of items in the collection. int ICollection.Count { get { return Ct; } }
Implementación de un objeto Enumerator para el método GetEnumerator
En esta sección se muestra cómo crear una Enumerator clase que pueda recorrer en CustomCollectioniteración .
Pegue el código de ejemplo siguiente después de la instrucción end class del módulo de clase:
public class Enumerator : IEnumerator { private int[] intArr; private int Cursor; }Declare la
intArrmatriz de enteros privada para contener los elementos de laCustomCollectionclase cuando se llama alGetEnumeratormétodo . ElCursormiembro de campo contiene la posición actual mientras se enumera.Agregue un constructor con
intArrcomo parámetro y establezca el valor localintArren este. Pegue el código de ejemplo siguiente después de la declaración del campo miembro:public Enumerator(int[] intarr) { this.intArr = intarr; Cursor = -1; }Implemente los métodos
ResetyMoveNext. 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)); }Resetestablece enCursor-1 yMoveNextmueve alCursorelemento siguiente.MoveNextdevuelve True si se ejecuta correctamente.Implemente la
Currentpropiedad de solo lectura que devuelve el elemento al que apunta .CursorSi esCursor-1, genera unInvalidOperationException. Pegue el código siguiente después delMoveNextmétodo :object IEnumerator.Current { get { if((Cursor < 0) || (Cursor == intArr.Length)) throw new InvalidOperationException(); return intArr[Cursor]; } }
Uso de para cada uno de ellos para recorrer en iteración la colección personalizada
En Form1.cs, en la pestaña Diseño , arrastre un botón al formulario.
Haga doble clic en el botón y agregue el código de ejemplo siguiente al
Clickevento del botón:CustomCollection MyCol = new CustomCollection(); foreach (object MyObj in MyCol) MessageBox.Show(MyObj.ToString());Presione F5 para ejecutar la aplicación y, a continuación, haga clic en el botón .
Nota:
Un cuadro de mensaje muestra los elementos de la colección personalizada.
¿Cómo funciona? Para cada llamada al GetEnumerator método para crear el Enumerator objeto y llama al método para establecer en Cursor MoveNext el primer elemento. A continuación, se obtiene acceso a la propiedad actual para obtener el elemento en MyObj. Esto se repite hasta MoveNext que devuelve False.