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

2 responses to “Visual Studio – Ordenando objetos en memoria”

  1. Buenisimo, muy útil y práctico.

    Like

  2. Esto es muy útil, aunque yo prefiero usar listas genéricas e implementar todas las comparaciones en una clase. Además ojo con usar esta misma técnica para types (int etc) porque ahí se produce una pérdida en el rendimiento debido al boxing/unboxing (razón por la cual implementaron generics en la version 2.0)

    Like

Leave a reply to Edgardo Cancel reply

Discover more from El Bruno

Subscribe now to keep reading and get access to the full archive.

Continue reading