Beruflich Dokumente
Kultur Dokumente
A menudo las aplicaciones necesitan manejar grandes cantidades de información. Hay muchas estructuras disponibles
en Visual C# para facilitar la gestión de esta información. Están agrupadas bajo el término colección. Como en la vida
corriente, hay diferentes tipos de colección. Puede haber personas que recuperan todo tipo de cosas, pero que no
siguen una organización particular para guardarlas; otras que están especializadas en la colección de un tipo de
objetos determinado, los maniáticos que toman todo tipo de precauciones posibles para poder encontrar con toda
seguridad un objeto...
Existe en el Framework .NET clases correspondiente a cada una de estas situaciones.
1. Las colecciones predefinidas
Las diferentes clases que permiten la gestión de colecciones se reparten entre dos espacios de nombres:
● System.Collections
● System.Collections.Generic
El primero contiene las clases normales, mientras que el segundo contiene las clases genéricas equivalentes que
permiten la creación de colecciones muy tipadas. Estas colecciones muy tipadas están especializadas en la gestión de
un tipo determinado de datos. Aunque estas muchas clases ofrecen funcionalidades diferentes, tienen muchos
puntos en común debido al hecho de que implementan las mismas interfaces. Por ejemplo, todas estas clases son
capaces de facilitar un objeto enumerator que permite recorrer el conjunto de la colección. De hecho se trata del
objeto utilizado por la instrucción foreach de Visual C#.
a. Array
La clase Array no forma parte del espacio de nombres System.Collections, pero se puede considerar a pesar de
todo como una colección, ya que implementa la interfaz Ilist. Las matrices creadas a partir de la clase Array tienen
un tamaño fijo. Esta clase contiene una multitud de métodos compartidos que permiten la ejecución de varias
funcionalidades en matrices. Hay dos propiedades muy útiles para el uso de la clase Array:
● Length, que representa el número total de elementos en la matriz.
● Rank, que contiene el número de dimensions de la matriz.
Se utiliza raramente esta clase para la creación de una matriz, ya que se prefiere utilizar la sintaxis Visual C# para
ello.
b. ArrayList y List
La clase ArrayList o su versión genérica List son evoluciones de la clase Array. Aportan muchas mejoras respeto a
esta última.
● El tamaño de un ArrayList es dinámico y se ajusta automáticamente a las necesidades.
● Propone métodos que permiten la adición, la inserción y la supresión de varios elementos de manera
simultánea en una sola operación.
Por el contrario, en algunos puntos, la clase ArrayList es menos eficaz que una simple matriz:
● Los ArrayList sólo tienen una única dimensión.
● Una matriz de datos de un tipo específico es más eficaz que un ArrayList cuyos elementos son generados
como Object. La utilización de la versión genérica (List) permite obtener rendimientos equivalentes.
Como cualquier clase, un ArrayList debe tener instancias antes de poder utilizarse. Hay dos constructores
disponibles. El primero es un constructor por defecto y crea un ArrayList con una capacidad inicial de cero. Luego
Hay que observar que el tamaño indicado no es definitivo y el ArrayList podrá contener más elementos de
lo previsto inicialmente.
La propiedad Capacity permite conocer el número de elementos que el ArrayList puede contener. La propiedad
Count indica el número actual de elementos en el ArrayList. Los métodos Add y AddRange añaden elementos al final
de la lista. Los métodos Insert y InsertRange permiten elegir la ubicación donde efectuar el añadido. La propiedad
Item, que es la propiedad por defecto de clase, se utiliza para alcanzar un elemento en una posición dada. La
supresión de elementos se hace por el método RemoveAt o RemoveRange; el primero espera como parámetro el índice
del elemento que hay que suprimir; el segundo exige además el número de elementos que hay que suprimir. El
método Clear es más radical y suprime todos los elementos.
El siguiente código ilustra el funcionamiento de esta clase:
Visualiza el resultado siguiente:
La capacidad de la lista no disminuye en el momento de la supresión de un elemento, incluso cuando la lista
está vacía.
c. Hashtable y Dictionary
Un Hashtable o su versión genérica Dictionary registra los datos bajo la forma de par clavevalor. El Hashtable se
compone internamente de compartimentos que contienen los elementos de la colección. Para cada elemento de la
colección, un código es generado por una función hash basada en la clave de cada elemento. Luego se utiliza el
código para identificar el compartimento en el cual se almancena el elemento. Durante la búsqueda de un elemento
en la colección, se efectúa la operación inversa. El código hash se genera desde la clave del elemento buscado.
Luego esta clave sirve para identificar el compartimento en el cual se encuentra el elemento buscado. Para que una
Hashtable pueda almacenar un objeto, éste debe ser capaz de facilitar su propio código hash.
d. Cola
Se utiliza este tipo de colección cuando se necesita un espacio de almacenamiento temporal. Cuando se recupera
un elemento desde la colección, se suprime al mismo tiempo de la colección.
Las colecciones de tipo Cola están adaptadas si se requiere acceder a los datos en el mismo orden que aquel en el
cual han sido almacenadas en la colección. Este tipo de gestión a veces se llama First In - First Out (FiFo). Las
tres principales operaciones disponibles son:
● Enqueue para añadir un elemento al final de la cola,
● Dequeue para obtener el elemento más antiguo de la cola y suprimirlo,
● Peek para obtener el elemento más antiguo sin suprimirlo de la cola.
El ejemplo siguiente ilustra la utilización de estos tres métodos.
e. Stack
Las colecciones de este tipo utilizan el mismo principio que las Cola: cuando se recupera un elemento de la
colección, se suprime de ella. La única distinción respecto a la clase Cola es el orden en el cual se recuperan los
elementos. Este tipo de colección utiliza la técnica last in - first out (lifo). El ejemplo clásico de este tipo de
gestión es la pila de platos de su cocina. Después de fregar, apila los platos en un estante. Al día siguiente, cuando
pone la mesa, el primer plato disponible es el último que se ha guardado el día anterior.
Las tres principales operaciones disponibles son:
● Push para añadir un elemento en la cima de la pila;
● Pop para obtener el elemento encima de la pila y suprimirlo;
● Peek para obtener el elemento encima de la pila sin suprimirlo de la pila.
2. Elegir un tipo de colección
A continuación le damos unos consejos para elegir el tipo de colección adaptado a sus necesidades.
● Si necesita acceder a los elementos de la colección con un índice: utilice un ArrayList.
● El acceso a los elementos debe efectuarse en el orden de la adición en la colección o en el orden inverso:
utilice una Cola o un Stack.
● Necesita ordenar todos los elementos en un orden diferente de aquel en el cual son añadidos a la colección:
utilice un ArrayList o un Hashtable.
● Los elementos que hay que almacenar en la lista son pares de clavevalor: utilice un Hashtable.