Mostrando las entradas con la etiqueta Colecciones. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Colecciones. Mostrar todas las entradas

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

30 mayo, 2007

Colecciones secuenciales de Objetos

Las colecciones Stack y Queue son dos tipos de colecciones que permiten el manejo de colecciones de datos secuenciales, veamos:

En el queue el primer elemento en entrar es el primero en salir (FIFO), veamos sus métodos

  • Enqueue = Agrega un elemento a la cola
  • Dequeue = Obtiene y elimina el siguiente método de la cola
  • Peek = Obtiene pero no elimina el siguiente método de la cola

Veamos un ejemplo:

Imports System.Collections

Module Module1

Sub Main()

Dim Cola As New Queue

Cola.Enqueue("Proceso_1")

Cola.Enqueue("Proceso_2")

Cola.Enqueue("Proceso_3")

Cola.Enqueue("Proceso_4")

Cola.Enqueue("Proceso_5")

While Cola.Count > 0

Console.WriteLine(Cola.Dequeue())

End While

Console.ReadKey()

End Sub

End Module

En el stack el último elemento en entrar es el primero en salir (LIFO), veamos sus métodos

  • Push = Agrega un elemento a la cola
  • Pop = Obtiene y elimina el siguiente método de la cola
  • Peek = Obtiene pero no elimina el siguiente método de la cola

Veamos un ejemplo:

Imports System.Collections

Module Module1

Sub Main()

Dim Pila As New Stack

Pila.Push("Proceso_1")

Pila.Push("Proceso_2")

Pila.Push("Proceso_3")

Pila.Push("Proceso_4")

Pila.Push("Proceso_5")

While Pila.Count > 0

Console.WriteLine(Pila.Pop())

End While

Console.ReadKey()

End Sub

End Module

Como podemos deducir de los ejemplos anteriores, el uso de ambas colecciones es bastante similar, la principal diferencia radica en el orden en el cual los elementos son extraídos.

26 mayo, 2007

Colecciones simples de Objetos

Vamos a conocer un poco sobre la colección más simple que nos proporciona el dot net Framework, el arraylist. Vemos los métodos más de mayor uso.

  • Add = Agrega un ítem a la colección
  • AddRange = Agrega una lista de ítems a la colección
  • Insert = Inserta un ítem en una lugar específico de la colección
  • InsertRange = inserta una lista de ítems en un lugar específico de la colección
  • Remove = Elimina un ítem de la colección
  • Remove at = Elimina un ítem de la colección basado en el índice del ítem
  • RemoveRange = Elimina una lista de ítems
  • Contains = Permite consultar si un ítem está contenido en la colección
  • Index of = Permite consultar el número del índice en el cual está contenido un ítem.
  • Clear = Elimina todos los ítem de la colección.

Antes de ver un ejemplo de cómo se usa todo esto, es importarte hacer referencia a que estas dos colecciones son colecciones de datos tipo object, por lo tanto, podríamos decir que son algo ineficientes desde el punto de vista de rendimiento, además, el compilador no nos ayuda mucho a prevenir errores de tipo de dato.

Imports System.Collections

Module Module1

Sub Main()

Dim datos As New ArrayList

For indice As Integer = 0 To 99

datos.Add(Rnd) 'Agrega un número aleatorio a la colección

Next

For indice As Integer = 99 To 0 Step -1

Console.WriteLine(datos(indice))

datos.RemoveAt(indice)

Next

Console.ReadKey()

End Sub

End Module

El recoger una colección de datos es muy tarea muy común y hay varias maneras de hacerlo, en el ejemplo anterior usamos un "For" pero el arraylist nos provee de la implementación del IEnumeration, esto nos permite recorrer la colección de una forma más fácil de entender y mantener, veamos:

Imports System.Collections

Module Module1

Sub Main()

Dim datos As New ArrayList

For indice As Integer = 0 To 99

datos.Add(Rnd) 'Agrega un número aleatorio a la colección

Next

Dim Navega_datos As IEnumerator = datos.GetEnumerator

Do While Navega_datos.MoveNext()

Console.WriteLine(Navega_datos.Current)

Loop

Navega_datos.Reset()

Console.ReadKey()

End Sub

End Module

Además de IEnumeration, contamos con la implementación de la interface ICollection, esta nos habilita el uso de lo siguiente:

  • Count = Retorna el número de elementos de la colección
  • Copyto = Copia el contenido de la colección en un arreglo

También es importante mencionar la interface Ilist que es la que le da la funcionalidad básica a la colección (add, addrange, clear, etc.)

24 mayo, 2007

Colecciones de datos

Todos los desarrolladores hemos tenido la necesidad de utilizar listas de datos, muchos solo hacen uso de los arreglos, sin embargo el dot net Framework nos proporciona una buena cantidad de listas especializadas, según el tipo de información que queramos manejar. Entonces el principal problema es determinar cuál es la lista más adecuada para el tipo de datos que queremos manejar. Conozcamos un poco las colecciones que encontramos en system.collections

Colección

Descripción

ArrayList

Almacena una lista de objetos

SortedList

Almacena una lista de objetos pero ordenados

Queue

Almacena una lista de objetos pero con la restricción de que el primer objeto en entrar es el primero en salir

Stack

Almacena una lista de objetos pero con la restricción de que el último objeto en entrar es el primero en salir

Hashtable

Almacena una colección de pares de valores, una llave y un valor.

SortedList

Almacena una colección de pares de valores, una llave y un valor, pero a diferencia de hashtable, los almacena de manera ordenada.

ListDiccionary

Tiene la misma funcionalidad del Hashtable, solo que optimizado para colecciones pequeñas (con pocos elementos)

HybridDiccionary

Esta colección se comporta como un ListDictionary cuando tiene pocos elementos, pero si la colección crece, toma el comportamiento del hashtable.

OrderedDictionary

Es muy similar al hashtable, pero agrega la funcionalidad necesaria para poder acceder a los elementos mediante un índice.

StringCollection

Es muy similar al ArrayList pero para manejar colecciones de string exclusivamente.

StringDiccionary

Es muy similar al Hashtable pero para manejar colecciones de string, tanto la llave como el valor tienen que ser string.

Las colecciones anteriormente citadas (a excepción de StringCollection y StringDiccionary) usan object como elementos, esto permite una gran confiabilidad pero no es lo mejor tomando en cuenta confiabilidad y el rendimiento. Cuando requiere de mejor rendimiento o mayor estabilidad de la aplicación (mediante la validación de tipos), el framework nos proporciona una serie de colecciones equivalentes a las anteriormente citadas, estas son llamadas colecciones genéricas (generic collection), y tienen la particularidad de comportarse igual que las anteriores pero con la particularidad que podemos definirle el tipo de dato que vamos a almacenar, ya no nos vemos obligados a usar el tipo "object".

El funcionamiento de estas colecciones es tan similar a las anteriormente vistas que existe una tabla de equivalencias, en la siguiente tabla podemos ver a la izquierda las colecciones que ya conocemos, pero cuando necesitemos trabajar con colecciones de un tipo de dato definido debemos usar el equivalente de la derecha, veamos:

Colección

Colección genérica

ArrayList

List

Queue

Queue

Stack

Stack

Hashtable

Dictionary

SortedList

SortedList

ListDictionary

Dictionary

HybridDictionary

Dictionary

OrderedDictionary

Dictionary

SortedDictionary

SortedDictionary

NameValueCollection

Dictionary

DictionaryEntry

KeyValuePair

StringCollection

List

StringDictionary

Dictionary

En futuros post espero poder mostrarles el funcionamiento de la mayoría de las colecciones.