Está en la página 1de 10

Colecciones en Visual Basic .

NET

Colecciones en Visual Basic .NET


Por Jorge Martn Rodrguez Castro
Actualizado al 27 de junio de 2006

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.

Dim Facultades As New Collection


Los dos mtodos clsicos para agregar y eliminar elementos de una coleccin son Add y
Remove.

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

Colecciones en Visual Basic .NET

El resultado sera el siguiente:

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:

Dim Enumerador As IEnumerator = Facultades.GetEnumerator


While Enumerador.MoveNext
Console.WriteLine(Enumerador.Current.ToString)
End While
Ing MCSD.NET Jorge Martn Rodrguez Castro

Colecciones en Visual Basic .NET

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.

Public Structure Empleado


Public DNI As String
Public Nombres As String
Sub New(ByVal DNI As String, ByVal Nombres As String)
Me.DNI = DNI
Me.Nombres = Nombres
End Sub
End Structure
Public Class Empresa
Private m_RUC As String
Private m_RazonSocial As String
Private m_Empleados As New Collection
Public Property RUC() As String
Get
Return m_RUC
End Get
Set(ByVal Value As String)
m_RUC = Value
End Set
End Property
Public Property RazonSocial() As String
Get
Return m_RazonSocial
End Get
Set(ByVal Value As String)
m_RazonSocial = Value
End Set
End Property
Public ReadOnly Property Empleados() As Collection
Get
Return m_Empleados
End Get
End Property
Public Sub AgregarEmpleado(ByVal NuevoEmpleado As Empleado)
m_Empleados.Add(NuevoEmpleado)
End Sub
Public Sub RemoverEmpleado(ByVal Indice As Integer)
m_Empleados.Remove(Indice)
End Sub
End Class
Module Module1
Sub Main()
Try
Dim MiEmpresa As New Empresa
Dim EmpleadoActual As Empleado
MiEmpresa.RUC = "167458744"
MiEmpresa.RazonSocial = "Importaciones Chiclayo"
MiEmpresa.AgregarEmpleado(New Empleado("1673", _
"Jorge Rodriguez"))
MiEmpresa.AgregarEmpleado(New Empleado("1020", _
"Julio Arevalo"))
MiEmpresa.AgregarEmpleado(New Empleado("1830", _
Ing MCSD.NET Jorge Martn Rodrguez Castro

Colecciones en Visual Basic .NET

"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

una lista secuencial donde un elemento es descartado luego de que el valor es


Utilice:
Queue
Stack

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:

Clase Queue (provee acceso el primero en entrar es el primero en salir)

Clase Stack (provee acceso el primero en entrar es el ltimo en salir)

El resto de clases coleccin ofrece acceso aleatorio.

Necesita acceder a cada elemento por su ndice? Utilice:

Clase ArrayList y StringCollection (con ndice basado en cero)

Clases Hashtable, SortedList, ListDictionary y StringDictionary (ofrecen acceso a


travs del valor clave)

Clases NameObjectCollectionBase y NameValueCollection (ofrece acceso con ndice


basado en cero o a travs del valor clave)

Cada elemento debe contener un valor, una combinacin clave-valor, o una combinacin
clave-valores? Utilice:

Para un valor, cualquier clase basada en la clase ILIst.

Para clave-valor, cualquier clase basada en la clase IDictionary.

Para clave-valores, clase NameValueColletion


bajo el espacio de nombre
System.Collection.Specialized

Necesita ordenar los elementos de forma diferente segn como ellos son ingresados? Utilice:

Clase Hashtable (ordena los elementos por el cdigo hash de la clave).

Clase SortedList, ordena elementos por clave, basado en la implementacin IComparer.

Clase ArrayList provee ordenamiento que toma la implementacin IComparer como


parmetro.

Necesita buscar y obtener informacin rpidamente? Utilice:

Clase ListDictionary es ms rpida que la clase Hashtable para colecciones pequeas (10
tems o menos).

Ing MCSD.NET Jorge Martn Rodrguez Castro

Colecciones en Visual Basic .NET

Necesita colecciones que acepten slo cadenas? Utilice:

Clase StringCollection (basada en IList) y StringDictionary (basada en IDictionary)


bajo el espacio de nombre System.Collecions.Specialized.
Fuente: MSDN Library Visual Studio .NET 2003

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.

Public Class Cliente


Private m_Nombre As String
Private m_HoraLlegada As Date
Public Property Nombre() As String
Get
Return m_Nombre
End Get
Set(ByVal Value As String)
m_Nombre = Value
End Set
End Property
Public Property HoraLlegada() As Date
Get
Return m_HoraLlegada
End Get
Set(ByVal Value As Date)
m_HoraLlegada = Value
End Set
End Property
Sub New()
End Sub
Sub New(ByVal pNombre As String, ByVal pHoraLlegada As Date)
m_Nombre = pNombre
m_HoraLlegada = pHoraLlegada
End Sub
End Class

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.")))

Ing MCSD.NET Jorge Martn Rodrguez Castro

Colecciones en Visual Basic .NET

' Llega cliente Carmen Torres, es la cuarta en la cola


Cola.Enqueue(New Cliente("Carmen Torres", CDate("08:30:00 a.m.")))
' Se atiene a cliente Luis Prez y sale de la cola
Cola.Dequeue()
' Llega cliente Anglica Correa, es la cuarta en la cola
Cola.Enqueue(New Cliente("Anglica Correa", CDate("08:32:00 a.m.")))
' Se atiene a cliente Mara Ceballos y sale de la cola
Cola.Dequeue()
' Se atiene a cliente Mario Saldaa y sale de la cola
Cola.Dequeue()
Console.WriteLine("Quedan {0} clientes en cola:", Cola.Count)
' Solo quedan en cola: Carmen Torres y Anglica Correa
For Each oCliente In Cola
Console.WriteLine("Cliente {0} lleg a las {1}", _
oCliente.Nombre, _
oCliente.HoraLlegada.ToShortTimeString)
Next
Console.ReadLine()
End Sub
End Module

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.

Public Class Switch


Private m_Marca As String
Private m_NumeroPuertos As Byte
Public Property Marca() As String
Get
Return m_Marca
End Get
Set(ByVal Value As String)
m_Marca = Value
End Set
End Property
Public Property NumeroPuertos() As Byte
Get
Return m_NumeroPuertos
End Get
Set(ByVal Value As Byte)
m_NumeroPuertos = Value
End Set
End Property
Sub New()
End Sub
Sub New(ByVal Marca As String, ByVal NumeroPuertos As Short)
Me.m_Marca = Marca
Me.m_NumeroPuertos = NumeroPuertos
End Sub
End Class
Ing MCSD.NET Jorge Martn Rodrguez Castro

Colecciones en Visual Basic .NET

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

Colecciones en Visual Basic .NET

El resultado sera como el mostrado en la figura:

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:

Dim Curso As New Collection


Curso.Add(New Estudiante("Alberto Torres", 14))
Curso.Add(New Estudiante("Cristina Zevallos", 16))
Dim MejorEstudiante As Estudiante
MejorEstudiante = CType(Curso(1), Estudiante)

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

Public Class Estudiante


Private m_Nombre As String
Private m_Nota As Integer
Public ReadOnly Property Nombre() As String
Get
Return Me.m_Nombre
End Get
End Property
Public ReadOnly Property Nota() As Integer
Get
Return Me.m_Nota
End Get
End Property
Ing MCSD.NET Jorge Martn Rodrguez Castro

Colecciones en Visual Basic .NET

Sub New(ByVal Nombre As String, ByVal Nota As Integer)


Me.m_Nombre = Nombre
Me.m_Nota = Nota
End Sub
End Class
Public Class Registro
Inherits CollectionBase
Default Public ReadOnly Property Item(ByVal Indice As Integer) _
As Estudiante
Get
Return CType(List.Item(Indice), Estudiante)
End Get
End Property
Sub Add(ByVal NuevoEstudiante As Estudiante)
list.Add(NuevoEstudiante)
End Sub
Sub Remove(ByVal EstudianteAEliminar As Estudiante)
List.Remove(EstudianteAEliminar)
End Sub
Sub New()
MyBase.New()
End Sub
End Class
Module Module3
Private MiRegistro As New Registro
Sub Main()
MiRegistro.Add(New
MiRegistro.Add(New
MiRegistro.Add(New
MiRegistro.Add(New

Estudiante("Juan Lpez", 12))


Estudiante("Ana Crdenas", 14))
Estudiante("Ernesto Pea", 8))
Estudiante("Luis Alberto Mendoza", 11))

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

Ing MCSD.NET Jorge Martn Rodrguez Castro

Colecciones en Visual Basic .NET

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.

Investigar acerca de las clases de coleccin no tratadas en este artculo.


Qu colecciones pueden devolver copias de s mismas en forma de arreglos?
Determine las ventajas y desventajas al usar Arreglos vs. Colecciones.

Jorge Martn Rodrguez Castro


Ingeniero en Computacin e Informtica
jorgerodcas@hotmail.com
www33.brinkster.com/jorgerodcas

Ing MCSD.NET Jorge Martn Rodrguez Castro

10

También podría gustarte