02 junio, 2007

Colecciones basadas en llaves y valores (Diccionarios)

Siguiendo con el tema de las colecciones vamos a ver otro tipo de colecciones, las que almacenan pares de valores (una llave y un valor).

Hashtable

El Hashtable es una colección que guarda pares de valores, almacena una llave y un valor. Usualmente es usada cuendo se requiere obtener un valor basado alguna clave que conocemos. Por ejemplo, un nombre de usuario asociado a un nombre completo, o un código asociado a un proveedor, veamos el ejemplo:

Imports System.Collections

Module Module1

Sub Main()

Dim clientes As New Hashtable

clientes.Add("01", "Cliente_01")

clientes.Add("02", "Cliente_02")

clientes.Add("03", "Cliente_03")

clientes.Add("04", "Cliente_04")

For Each cliente As DictionaryEntry In clientes

Console.WriteLine("Código: {0}, Nombre: {1}", cliente.Key, cliente.Value)

Next

Console.ReadKey()

End Sub

End Module

Es importante que tomemos en cuenta que si tratamos de almacenar dos entradas con la misma llave, la primer entrada será sustituida, podemos decir más técnicamente que si el hash de las dos llaves es igual el valor será sustituido.

SortedList

Es prácticamente igual al hashtable con la diferencia que en esta colección los datos se almacenan de manera ordenada. Veamos:

Imports System.Collections

Module Module1

Sub Main()

Dim clientes As New SortedList

clientes.Add("03", "Cliente_03")

clientes.Add("02", "Cliente_02")

clientes.Add("04", "Cliente_04")

clientes.Add("01", "Cliente_01")

For Each cliente As DictionaryEntry In clientes

Console.WriteLine("Código: {0}, Nombre: {1}", cliente.Key, cliente.Value)

Next

Console.ReadKey()

End Sub

End Module

ListDiccionary

Es ListDiccionary es prácticamente igual al hashtable, solo que es más eficiente para colecciones pequeñas. Es considerada como una colección especializada, por eso la encontramos en System.Collections.Specialized. Veamos:

Imports System.Collections

Imports System.Collections.Specialized

Module Module1

Sub Main()

Dim clientes As New ListDictionary

clientes.Add("03", "Cliente_03")

clientes.Add("02", "Cliente_02")

clientes.Add("04", "Cliente_04")

clientes.Add("01", "Cliente_01")

For Each cliente As DictionaryEntry In clientes

Console.WriteLine("Código: {0}, Nombre: {1}", cliente.Key, cliente.Value)

Next

Console.ReadKey()

End Sub

End Module

HybridDictionary

Esta es otra colección especializada, vimos anteriormente que tenemos el hashtable, muy eficiente para colecciones grandes, y luego el ListDictionary para colecciones pequeñas, pero que pasa cuando la colección que estamos implementando es algunas veces grande y otras veces pequeña, para estos casos se recomiendo la implementación mediante el HybridDictionary, ya que esta colección tiene la capacidad de comportarse como un ListDictionary pero cuando la colección crece automáticamente se trasforma en un Hashtable, siendo entonces bastante eficiente para ambientes irregulares (donde el tamaño de las colección varía sustancialmente).

Imports System.Collections

Imports System.Collections.Specialized

Module Module1

Sub Main()

Dim clientes As New HybridDictionary

clientes.Add("03", "Cliente_03")

clientes.Add("02", "Cliente_02")

clientes.Add("04", "Cliente_04")

clientes.Add("01", "Cliente_01")

For Each cliente As DictionaryEntry In clientes

Console.WriteLine("Código: {0}, Nombre: {1}", cliente.Key, cliente.Value)

Next

Console.ReadKey()

End Sub

End Module

OrderedDictionary

El OrderedDictionary es otra colección especializada, y nos da prácticamente la misma funcionalidad de un hashtable, pero agrega la funcionalidad necesaria para poder acceder los ítems por medio de un índice. Adicional a los métodos del hashtable el OrderedDictionary tiene un insert y un removeat para poder controlar el orden de los elementos. Pero mejor veamos un ejemplo:

Imports System.Collections

Imports System.Collections.Specialized

Module Module1

Sub Main()

Dim clientes As New OrderedDictionary

clientes.Add("03", "Cliente_03")

clientes.Insert(0, "02", "Cliente_02")

clientes.Add("04", "Cliente_04")

clientes.Insert(0, "01", "Cliente_01")

For Each cliente As DictionaryEntry In clientes

Console.WriteLine("Código: {0}, Nombre: {1}", cliente.Key, cliente.Value)

Next

Console.ReadKey()

End Sub

End Module

1 comentario:

IX ciclo Sistemas dijo...

hola, esta muy bueno el material,
en un hastable como podria obtener el key de un valor obtenido con con el metodo hashtable.ContainsValue("client_01")
si la tabla es hashtable.add("01","Cliente_01")


if hashtable.ContainsValue("client_01") then
a ki kisiera obtener el valor 01
clave= ???
endif