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



Responder a