Hace un tiempo me preguntaron qué tipo de colección era la más adecuada para almacenar diferentes tipos de objetos y tener la capacidad de ordenar los mismos de acuerdo a diferentes tipos de criterios. En un principio propuse la utilización de una SortedList, pero en la misma los criterios de ordenación se aplican de acuerdo a las claves de los elementos en la colección. La mejor opción es utilizar un ArrayList.
Pensemos en una clase Persona; y para manejar la colección poseemos una clase Personas; que hereda de ArrayList;
|
Public Class Persona
Public Nombre As String Public Edad As Integer
Public Sub New(ByVal pNombre As String, ByVal pEdad As Integer) Nombre = pNombre Edad = pEdad End Sub
Public Overrides Function ToString() As String Return "Nombre:" & Me.Nombre & vbTab & " Edad:" & Me.Edad & vbNewLine End Function End Class
Public Class Personas Inherits System.Collections.ArrayList End Class
|
Trabajando con estas clases, podemos crear una nueva colección y cargar datos en la misma, por ejemplo, dentro del evento Load() de un formulario podemos agregar el siguiente código;
|
Dim pers As New Personas Dim per As Persona
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
‘ carga las personas pers.Add(New Persona("Bruno", 29)) pers.Add(New Persona("Pedro", 32)) pers.Add(New Persona("Pablo", 25)) pers.Add(New Persona("Jose", 30))
End Sub
|
Una de los métodos que soporta la clase ArrayList es Sort(), este método permite ordenar los elementos del array de acuerdo a una serie de parámetros. Una de las sobrecargas recibe un parámetro que implemente la interfaz IComparer, utilizando la misma, podemos crear nuestras clases personalizadas con los criterios de ordenamiento que elijamos.
Por ejemplo, la siguiente clase ordena una colección de elementos teniendo en cuenta la propiedad Edad.
|
‘ Compara y ordena por la edad de la persona Public Class ComparerPersonaEdad Implements IComparer
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim personaX As Persona = x Dim personay As Persona = y
If personaX.Edad > personay.Edad Then Return 1 ElseIf personaX.Edad < personay.Edad Then Return -1 Else Return 0 End If
End Function End Class
|
Este clase ordena de acuerdo al nombre de la Persona,
|
‘ Compara y ordena por el nombre de la persona Public Class ComparerPersonaNombre Implements IComparer
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim personaX As Persona = x Dim personay As Persona = y
If personaX.Nombre > personay.Nombre Then Return 1 ElseIf personaX.Nombre < personay.Nombre Then Return -1 Else Return 0 End If
End Function End Class
|
Para ordenar por Edad o por Nombre, es necesario llamar al método Sort() y pasar por parámetro el objeto correspondiente, por ejemplo;
|
pers.Sort(New ComparerPersonaEdad) Call DisplayPersonas()
|
Esta funcionalidad es realmente útil en determinadas ocasiones, cuando por ejemplo no tenemos acceso a colecciones que se obtengan desde una base de datos.
Además tenemos que tener en cuenta que en la versión de .Net 2.0, hay new features, como por ejemplo la capacidad de aplicar diferentes criterios para ordenar los elementos en la clase SortedList.
Y en la futura versión de .Net tendremos Linq (Language Integraqted Query), que consiste en una serie de extensiones que permitirán a .NET (C# y Visual Basic) acceder a funciones de consulta y transformación de colecciones de datos de forma integrada. Esta integración nos permitirá trabajar con colecciones de objetos en memoria y tratarlos como si fuesen objetos de bases de datos, con sentencias en un lenguaje muy parecido al TSQL. Mas información aquí.
Saludos
El Bruno
Leave a reply to Edgardo Cancel reply