Manejo básico de colecciones Hashtable

Manejo básico de colecciones Hashtable

Supongamos como ejemplo, que un proceso en una aplicación necesita guardar de forma temporal, datos de un cliente en un array. Podemos naturalmente utilizar un array estándar para tal fin, como muestra el Código fuente 375.

Dim aCliente = Array.CreateInstance(GetType(Object), 6) aCliente(0) = 22 aCliente(1) = "Pedro"

Programación con Visual Basic .NET © Grupo EIDOS

aCliente(2) = "Naranjo" aCliente(3) = "C/Rio Bravo, 25" aCliente(4) = 35 aCliente(5) = 250

Código fuente 375

En un planteamiento como el anterior, debemos acordarnos, a la hora de obtener los datos del array, que la primera posición corresponde al código de cliente, la siguiente al nombre, etc.,. Bien es cierto que podemos utilizar constantes numéricas para cada posición, pero sigue siendo una solución poco flexible.

Utilizando un objeto Hashtable sin embargo, tenemos la ventaja de que no necesitamos saber la posición en que se encuentra cada valor, ya que precisamente a cada posición le damos un nombre clave que es mediante el que accedemos posteriormente cuando queremos obtener los valores. El Código fuente 376, mejora sustancialmente el fuente del caso anterior, al estar basado en una colección Hashtable.

Sub Main() ' declarar colección Hashtable Dim htCliente As Hashtable htCliente = New Hashtable()

' añadir valores htCliente.Add("ID", 22) htCliente.Add("Nombre", "Pedro") htCliente.Add("Apellidos", "Naranjo") htCliente.Add("Domicilio", "C/Rio Bravo, 25") htCliente.Add("Edad", 35) htCliente.Add("Credito", 250)

' mostrar el número de elementos que contiene Console.WriteLine("El objeto Hashtable tiene {0} elementos", _

htCliente.Count) Console.WriteLine()

' obtener algunos valores Console.WriteLine("Obtener algunos valores del objeto Hashtable") Console.WriteLine("Domicilio: {0} ", htCliente.Item("Domicilio")) Console.WriteLine("Nombre: {0} ", htCliente("Nombre")) Console.WriteLine("Credito: {0} ", htCliente("Credito")) Console.WriteLine()

' recorrer el array al completo Console.WriteLine("Recorrer objeto Hashtable con un enumerador") Dim oEnumerador As IDictionaryEnumerator oEnumerador = htCliente.GetEnumerator() While oEnumerador.MoveNext()

Console.WriteLine("Clave: {0} / Valor: {1}", _ oEnumerador.Key, oEnumerador.Value) End While

Console.ReadLine() End Sub

Código fuente 376

© Grupo EIDOS 24. Colecciones

Para crear un nuevo objeto Hashtable hemos utilizado el constructor sin parámetros, que es el más básico disponible. Puesto que se trata de un constructor sobrecargado, sugerimos al lector que consulte la documentación de .NET Framework para ver una lista completa de todos los constructores disponibles.

Respecto a la asignación de valores a la colección, esta clase utiliza el método Add( ), cuyo primer parámetro corresponde a la clave del elemento y el segundo corresponde al valor que vamos a asignar

a la posición de su array. Para obtener un valor del array utilizamos el método Item( ), pasando como parámetro el nombre de la

clave de la que vamos a obtener el valor correspondiente. Al tratarse del método por defecto de esta clase no es necesario especificarlo. Como hemos podido comprobar, el resultado es el mismo tanto si especificamos como si no el nombre del método.

Si queremos recorrer el array al completo contenido en el objeto, podemos utilizar el método GetEnumerator( ), que nos devuelve un enumerador para poder obtener todos los valores del objeto en un bucle. La diferencia con los otros algoritmos de recorrido que hemos visto anteriormente, es que al estar la colección Hashtable basada en una combinación de clave/valor, necesitamos un enumerador basado en el interfaz IDictionaryEnumerator, especialmente adaptado para manipular arrays de este tipo.

Como habrá comprobado el lector, un enumerador IDictionaryEnumerator proporciona la información

de la colección mediante las propiedades Key y Value, a diferencia de un enumerador simple, basado en IEnumerator, en el que usamos la propiedad Current, para extraer los datos.

La clase Hashtable no sitúa los valores que se añaden al array en posiciones consecutivas, por lo que al obtener los valores mediante un enumerador posiblemente no aparecerán en el mismo orden en el que los añadimos inicialmente. Dada la filosofía de funcionamiento de este tipo de objetos, el orden en el que se graban los valores dentro del array no debería ser un problema, ya que nosotros accedemos al array utilizando claves y no índices, como sucede en un array estándar.