No se puede con la implementacion de IComparable porque tengo que definir el
ordenamiento en cada objeto y me quitaria la flexibilidad de poder decir que
campos y que precedencia quiero. Con IComparable debo decirle como se ordena
en el codigo del compareTo
Espero que se entienda.
Javier
----- Original Message -----
From: "Carlos S. Villalba" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Friday, June 01, 2007 12:56 PM
Subject: [puntonet] Pregunta sobre ordenamiento
Es verdad, justamente era lo que iba a recomendar. Me ahorraste usar mis
dedos!!!.
___________________________________________
Sebastian Villalba
Award Support S.R.L.
[EMAIL PROTECTED]
Tel/Fax: 4541-0503 y lineas rotativas
___________________________________________
-----Mensaje original-----
De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Leonardo
Micheloni
Enviado el: viernes, 01 de junio de 2007 12:54
Para: [email protected]
Asunto: [puntonet] Pregunta sobre ordenamiento
Estás usando .net 2? porque si es así yo usaría una lista genérica y
de un modo muy fácil haría un sort implementarndo IComparable con el
criterio que quiera.
On 6/1/07, Pata del Santo <[EMAIL PROTECTED]> wrote:
yo la lista de parámetros la pasaría como un array de string, para no
estar
agregando parámetros opcionales en orderList
________________________________
De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de MYMTEC
S.A. - Javier Wamba
Enviado el: viernes, 01 de junio de 2007 16:08
Para: [email protected]
Asunto: [puntonet] Pregunta sobre ordenamiento
Buen dia!
Hoy tengo una pregunta con respecto a mi codigo.
El problema que esto intenta resolver es ordenar una lista por propiedades
de sus objetos por ejemplo podria tener un objeto:
persona que tiene las propiedades fechaDeNacimiento y provincia( que es un
objeto que contiene la propiedad id) entonces podria escribir
funciones.orderList(listaDePersonas,"fechaDeNaciemiento
DESC","provincia.id ASC")
donde a partir del segundo parametro se define el criterio de
ordenamiento.
Queria saber si esta bien hecho o hay algo que ya lo hace y de forma
optimizada.
Y si alguien se pregunta porque lo hice asi: Es una de las tantas de mi
jefe!
Saludos y gracias,
Javier Wamba
Imports System
Public Class Funciones
#Region "Ordenamiento"
Private Shared mutexOrden As New Threading.Mutex
Private Shared ordenamientos() As String
Public Shared Sub orderList(ByVal list As List(Of base), ByVal ParamArray
orders() As String)
mutexOrden.WaitOne()
Try
ordenamientos = orders
list.Sort(AddressOf order)
mutexOrden.ReleaseMutex()
Catch ex As Exception
mutexOrden.ReleaseMutex()
End Try
End Sub
Private Shared Function devolverPropiedad(ByVal b1 As entidades.base,
ByVal
prop() As String, ByVal index As Integer) As Object
Try
If prop.Length - 1 = index Then
Return b1.GetType.GetProperty(prop(index)).GetValue(b1, Nothing)
Else
Return devolverPropiedad(b1.GetType.GetProperty(prop(index)).GetValue(b1,
Nothing), prop, index + 1)
End If
Catch ex As Exception
Throw ex
End Try
End Function
Private Shared Function orderAuxiliar(ByVal b1 As entidades.base, ByVal b2
As entidades.base, ByVal index As Integer) As Integer
Dim vec() As String
Try
vec = ordenamientos(index).Split(" ")
If vec.Length = 2 Then
Dim compar As Integer = devolverPropiedad(b1, vec(0).Split("."),
0).compareto(devolverPropiedad(b2, vec(0).Split("."), 0))
If compar = 0 Then
If ordenamientos.Length - 1 = index Then
Return compar
Else
Return orderAuxiliar(b1, b2, index + 1)
End If
Else
If vec(1).ToUpper = "DESC" Then
Return compar * (-1)
Else
Return compar
End If
End If
ElseIf vec.Length = 1 Then
Dim compar As Integer = devolverPropiedad(b1, vec(0).Split("."),
0).compareto(devolverPropiedad(b2, vec(0).Split("."), 0))
If compar = 0 Then
If ordenamientos.Length - 1 = index Then
Return compar
Else
Return orderAuxiliar(b1, b2, index + 1)
End If
Else
Return compar
End If
Else
Throw New Exception("Demasiados espacios")
End If
Catch ex As Exception
Throw ex
End Try
End Function
Private Shared Function order(ByVal b1 As entidades.base, ByVal b2 As
entidades.base) As Integer
Try
Return orderAuxiliar(b1, b2, 0)
Catch ex As Exception
Throw ex
End Try
End Function
#End Region
End class
Public Class base
Friend Sub New()
End Sub
End Class