Uso de Visual C# para implementar colecciones personalizadas
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ónSystem.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 ICollection interfaz hereda de la IEnumerable interfaz. 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 Windows.
En Explorador de soluciones, haga clic con el botón derecho en el nombre del proyecto, seleccione Agregary, 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 espacio de
System.Collectionnombres: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; } }Por motivos de simplicidad, 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 puede recorrer en iteración CustomCollection.
Pegue el código de ejemplo siguiente después de la instrucción de clase final en el módulo de clase:
public class Enumerator : IEnumerator { private int[] intArr; private int Cursor; }Declare la
intArrmatriz de enteros privados para contener los elementos de laCustomCollectionclase cuando se llama alGetEnumeratormétodo . ElCursormiembro de campo mantiene la posición actual al enumerar.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
Resetmétodos yMoveNext. 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 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 esto? Para cada una de ellas llama al GetEnumerator método para crear el Enumerator objeto y llama al MoveNext método para establecer en Cursor 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.