Documentos de Académico
Documentos de Profesional
Documentos de Cultura
NET
Contenido
Introduccin.
Colecciones en clases.
Clases Collection.
Clase Queue.
Clase Stack.
Clase ArrayList.
Colecciones personalizadas.
Conclusiones.
Preguntas.
Introduccin
En trminos generales, una coleccin es una forma de agrupar y manejar objetos relacionados. Por
ejemplo, cada formulario tiene una coleccin de controles, as, este objeto representa a todos los
controles que estn contenidos en el formulario. Esto permite que podamos acceder a un control
especfico de la coleccin a travs un ndice. El recorrido por todos los miembros de una coleccin se
efecta a travs de la estructura de control For Each...Next.
Visual Basic provee la clase Collection a partir de la cual es posible definir colecciones personalizadas.
Una coleccin puede ser de base cero o base uno, dependiendo de su naturaleza. El estndar para
el .NET Framework son las colecciones basadas en cero, aunque Visual Basic .NET trabaja originalmente
con colecciones basadas en uno, por compatibilidad con versiones anteriores del lenguaje.
Muchas colecciones en Visual Basic permiten acceder a sus elementos a travs de su ndice o a travs de
una clave (key).
El siguiente ejemplo muestra cmo crear una coleccin sencilla.
Module Colecciones
Sub Main()
Dim Facultades As New Collection
Dim Facultad As String
Facultades.Add("Ciencias Fsicas y Matemticas", "FACFyM")
Facultades.Add("Ingeniera Mecnica y Elctrica", "FIME")
Facultades.Add("Educacin y Ciencias Sociales", "FACHSE")
Facultades.Add("Ingeniera Qumica", "FIQIA")
' Eliminamos indicando ndice
Facultades.Remove(3)
' Eliminamos indicando clave (key)
Facultades.Remove("FACFyM")
For Each Facultad In Facultades
Console.WriteLine(Facultad)
Next
Console.ReadLine()
End Sub
End Module
Ing MCSD.NET Jorge Martn Rodrguez Castro
Al utilizar el mtodo Add, podemos indicar la posicin que ocupar el nuevo elemento con
respecto a los elementos ya existentes en la coleccin (indicando el nmero de ndice del
elemento referenciado o su valor de clave).
Module Colecciones
Sub Main()
Dim Facultades As New Collection
Dim Facultad As String
Facultades.Add("Ciencias Fsicas y Matemticas", "FACFyM")
Facultades.Add("Ingeniera Mecnica y Elctrica", "FIME")
' Insercin de nuevo elemento una posicin anterior a FIME
Facultades.Add("Educacin y Ciencias Sociales","FACHSE","FIME")
' Insercin de nuevo elemento una posicin despus de FACFyM
Facultades.Add("Ingeniera Qumica", "FIQIA", , 1)
For Each Facultad In Facultades
Console.WriteLine(Facultad)
Next
Console.WriteLine("Total de Facultades: {0}", _
Facultades.Count.ToString)
Console.ReadLine()
End Sub
End Module
El resultado sera el siguiente:
Las colecciones pueden tambin ser recorridas a travs de enumeradores, teniendo en cuenta
que el recorrido a travs de stos slo permiten la lectura de los elementos de la coleccin y no
su modificacin. El cdigo resaltado en el ejemplo anterior es equivalente al siguiente:
Colecciones en Clases
Es posible crear colecciones como parte de la definicin de una clase con el fin de almacenar un grupo de
valores determinado. Cabe aclarar que no slo podemos considerar tipos bsicos para crear colecciones,
sino instancias de clases, dado que el mtodo Add acepta un elemento de tipo Object como argumento.
"Blanca Quiroga"))
MiEmpresa.AgregarEmpleado(New Empleado("2514", _
"Ricardo Gonzales"))
MiEmpresa.RemoverEmpleado(4)
Console.WriteLine(MiEmpresa.RazonSocial)
Console.WriteLine(MiEmpresa.RUC)
Console.WriteLine()
For Each EmpleadoActual In MiEmpresa.Empleados
Console.WriteLine("{0} - {1}", _
EmpleadoActual.DNI, EmpleadoActual.Nombres)
Next
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
Console.Read()
End Try
End Sub
End Module
Clases Collection
Existe una amplia gama de clases que derivan de System.Collections y que pueden utilizarse para
implementar colecciones. Debemos tener cierto cuidado al momento de elegir un tipo de clase base para
nuestra coleccin con el fin de no limitar su funcionalidad. Este artculo slo abarcar las clases ms
comunes.
Para seleccionar una clase coleccin considere las siguientes preguntas:
Necesita
devuelto?
Clase
Clase
Necesita acceder a los elementos en un cierto orden, como el primero en entrar es el primero
en salir, el primero en entrar es el ltimo en salir, o aleatoriamente? Utilice:
Cada elemento debe contener un valor, una combinacin clave-valor, o una combinacin
clave-valores? Utilice:
Necesita ordenar los elementos de forma diferente segn como ellos son ingresados? Utilice:
Clase ListDictionary es ms rpida que la clase Hashtable para colecciones pequeas (10
tems o menos).
Clase Queue
Representa una coleccin de objetos a los que se accede bajo la poltica FIFO (Firts In is a First Out: el
primero en entrar es el primero en salir). Para incluir o excluir elementos en la coleccin hacemos uso de
los mtodos Enqueue y Dequeue.
Module Module1
Sub Main()
' Simulacin de una Cola de clientes que esperan ser atendidos
Dim Cola As New Queue
Dim oCliente As New Cliente
' Llega cliente Juan Lpez, es el primero en la cola
Cola.Enqueue(New Cliente("Juan Lopez", CDate("08:05:00 a.m.")))
' Llega cliente Luis Prez, es el segundo en la cola
Cola.Enqueue(New Cliente("Luis Prez", CDate("08:08:00 a.m.")))
' Llega cliente Mara Ceballos, es la tercera en la cola
Cola.Enqueue(New Cliente("Maria Ceballos", CDate("08:12:00 a.m.")))
' Se atiene a cliente Juan Lpez y sale de la cola
Cola.Dequeue()
' Llega cliente Mario Saldaa, es el tercero en la cola
Cola.Enqueue(New Cliente("Mario Saldaa", CDate("08:25:00 a.m.")))
Clase Stack
Representa una coleccin de objetos a los que se accede bajo la poltica LIFO (Last In is a First Out: el
primero en entrar es el primero en salir). Para incluir o excluir elementos en la coleccin hacemos uso de
los mtodos Push y Pop.
Module Module1
Sub Main()
Dim Pila As New Stack
Dim oSwitch As New Switch
' Apilamos Switchs uno encima de otro
Pila.Push(New Switch("DLINK", 24))
Pila.Push(New Switch("3COM", 24))
Pila.Push(New Switch("CONNECT", 24))
Pila.Push(New Switch("POWER", 12))
' Retiramos el Switch POWER
Pila.Pop()
' Retiramos el Switch CONNECT
Pila.Pop()
' Retiramos el Switch 3COM
Pila.Pop()
Console.WriteLine("Quedan {0} Switchs", Pila.Count)
' Slo que el Switch DLINK
For Each oSwitch In Pila
Console.WriteLine("Switch {0} de {1} puertos", _
oSwitch.Marca, oSwitch.NumeroPuertos)
Next
Console.ReadLine()
End Sub
End Module
Clase ArrayList
Clase que implementa la interfase IList que utiliza un arreglo cuyo tamao cambia dinmicamente
cuando es requerido. Es una coleccin con ndice basado en cero. Permite elementos duplicados a travs
de la asignacin Nothing como referencias nulas a elementos. Este tipo de clase es muy utilizada
debido a su compatibilidad con controles de Windows Forms.
Module Module1
Sub Main()
Dim Lista As New ArrayList
Dim Ciudad As String
Lista.Add("Lambayeque")
Lista.Add("Lima")
Lista.Add("Trujillo")
Lista.Add("Tacna")
Lista.Add("Arequipa")
Lista.Add("Puno")
Lista.Insert(3, "Madre de Dios")
Lista.Add("Cusco")
' Eliminamos la ciudad en posicion 2: Trujillo
Lista.RemoveAt(2)
' Eliminamos la ciudad de Tacna
Lista.Remove("Tacna")
Console.WriteLine("Ciudades existentes: {0}", Lista.Count)
' Ordenamos la lista ascendentemente
Lista.Sort()
For Each Ciudad In Lista
Console.WriteLine(Ciudad)
Next
' Removemos todos los elementos de la lista
Lista.Clear()
Console.ReadLine()
End Sub
End Module
Ing MCSD.NET Jorge Martn Rodrguez Castro
Importante
Puede crear clases que implementan interfaces de comparacin, como IComparer, para personalizar la
forma en que se ordenan los datos en una coleccin de tipos complejos. Utilice el mtodo Sort de la
coleccin creada para ordenar sus elementos.
Importante
Debido a que algunas colecciones admiten elementos de tipo Object es necesario realizar conversiones
explcitas para recuperar los valores y poder utilizarlos con seguridad:
Colecciones Personalizadas
Puede crear sus propias colecciones derivando de la clase CollectionBase. Dado que esta clase hereda
de CollectionBase, ya tiene gran parte de la funcionalidad de la coleccin implementada. Hay un
mtodo Clear para borrar la coleccin y una propiedad Count que mantiene un seguimiento del nmero
de miembros actuales. Adems, existe un objeto Protected, denominado List, que se puede utilizar
para hacer un seguimiento de los elementos. Sin embargo, no existe mtodo Add, mtodo Remove ni
propiedad Item. Su implementacin se deja al programador.
El siguiente ejemplo
CollectionBase:
muestra
cmo
crear
una
coleccin
personalizada
sencilla
basada
en
Call MostrarColeccion()
Dim EstudianteJalado As Estudiante = MiRegistro(2)
Console.WriteLine("{0} est jalado con {1}", _
EstudianteJalado.Nombre, EstudianteJalado.Nota.ToString)
MiRegistro.Remove(EstudianteJalado)
Call MostrarColeccion()
Console.ReadLine()
End Sub
Private Sub MostrarColeccion()
Console.WriteLine()
For Each EstudianteActual As Estudiante In MiRegistro
Console.WriteLine("{0} ({1})", EstudianteActual.Nombre, _
EstudianteActual.Nota.ToString)
Next
Console.WriteLine("Total: {0}", MiRegistro.Count.ToString)
Console.WriteLine()
End Sub
End Module
Conclusiones
Queda claro que las colecciones proveen mayor flexibilidad que los arreglos porque implementan
funciones comunes de acceso a sus elementos. Adems, al existir una amplia variedad de colecciones
sobre las cuales implementar nuestras aplicaciones, el desarrollador tendr la libertad de seleccionar el
tipo de coleccin segn sus necesidades.
Por otro lado, las clases base de manejo de colecciones y las interfaces para este tipo de trabajo amplan
las capacidades de las que podemos dotar a nuestras colecciones; ms an, cuando la gran mayora
acepta como elementos datos de tipo Object, lo cual garantiza que cualquier tipo de dato derivado de
ste pueda ser admitido en la coleccin.
Preguntas
1.
2.
3.
10