Operaciones varias con colecciones Hashtable

Operaciones varias con colecciones Hashtable

Antes de obtener valores de un objeto Hashtable, podemos comprobar que la clave o valor que necesitamos están realmente en la colección, empleando respectivamente los métodos ContainsKey( ) y ContainsValue( ). Al primero le pasamos como parámetro la clave a buscar, mientras que al segundo le pasamos el valor. Ambos métodos devuelven un resultado de tipo Boolean, que indica si la comprobación tuvo o no éxito.

Por otra parte, el método Remove( ), elimina un elemento del objeto, pasándole como parámetro la clave a borrar, mientras que el método Clear( ), elimina el contenido completo de la colección. El Código fuente 377 muestra un ejemplo.

Sub Main() ' crear colección Hashtable y añadir valores Dim htCliente As New Hashtable() 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)

' comprobar la existencia de elementos por la clave

Programación con Visual Basic .NET © Grupo EIDOS

Dim sClave As String Console.WriteLine("Introducir la clave a buscar") sClave = Console.ReadLine() If htCliente.ContainsKey(sClave) Then

Console.WriteLine("La clave {0} existe, su valor es: {1}", _ sClave, htCliente(sClave)) Else Console.WriteLine("La clave {0} no existe", sClave) End If Console.WriteLine()

' comprobar la existencia de elementos por el valor Dim oValor As Object Console.WriteLine("Introducir el valor a buscar") oValor = Console.ReadLine() ' antes de comprobar si existe el valor ' debemos hacer una conversión al tipo ' específico de dato del contenido de ' la variable oValor If IsNumeric(oValor) Then

oValor = CType(oValor, Integer) Else oValor = CType(oValor, String) End If ' ahora comprobamos If htCliente.ContainsValue(oValor) Then

Console.WriteLine("El valor {0} existe", oValor) Else Console.WriteLine("El valor {0} no existe", oValor) End If

' para borrar un elemento se usa la clave htCliente.Remove("Nombre") Console.WriteLine() RecorrerHT(htCliente)

' ahora borramos el contenido al completo del objeto htCliente.Clear()

Console.ReadLine() End Sub

Public Sub RecorrerHT(ByVal htTabla As Hashtable) Dim oEnumerador As IDictionaryEnumerator oEnumerador = htTabla.GetEnumerator() While oEnumerador.MoveNext()

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

Código fuente 377

Las propiedades Keys y Values de la clase Hashtable, devuelven un array con los nombres de las claves y los valores de un objeto Hashtable respectivamente.

Realmente devuelven un objeto del interfaz ICollection, pero ya que un array implementa este interfaz, dicho objeto podemos manipularlo como un array.

Seguidamente mostramos un ejemplo del uso de estas propiedades en el Código fuente 378. Observe el lector el diferente modo de declarar y obtener los objetos ICollection e IEnumerator, que en definitiva, nos llevan al mismo resultado, demostrando así, la gran flexibilidad sintáctica que la especificación CLS proporciona al lenguaje.

© Grupo EIDOS 24. Colecciones

Sub Main() ' crear y llenar la colección Dim htCliente As New Hashtable() 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)

' obtener un array con las claves, ' y recorrer con un enumerador Dim aClaves As ICollection aClaves = htCliente.Keys Dim oEnumerador As IEnumerator oEnumerador = aClaves.GetEnumerator() Console.WriteLine("Claves del objeto Hashtable") RecorrerEnumerador(oEnumerador)

' obtener un array con los valores, ' y recorrer con un enumerador Dim aValores As ICollection = htCliente.Values Dim oEnumVal As IEnumerator = aValores.GetEnumerator() Console.WriteLine("Valores del objeto Hashtable") RecorrerEnumerador(oEnumVal)

Console.ReadLine() End Sub

Public Sub RecorrerEnumerador(ByVal oEnumerador As IEnumerator) While oEnumerador.MoveNext Console.WriteLine(oEnumerador.Current) End While Console.WriteLine()

End Sub

Código fuente 378