none
Ordenar un Coleccion por Fecha RRS feed

  • Pregunta

  • Hola tengo una coleccion de obj asuntos , donde cada asunto tiene una propiedad que es fecha , quiero saber como hago para ordenar esa coleccion de asuntos por fecha !

    Gracias


    jueves, 21 de febrero de 2013 5:58

Respuestas

  • "Nicolas Bringa" escribió:

    > tengo una coleccion de obj asuntos , donde cada asunto tiene
    > una propiedad que es fecha , quiero saber como hago para
    > ordenar esa coleccion de asuntos por fecha !

    Hola, Nicolás:

    Como no has indicado qué tipo de colección estás utilizando, simplemente me voy a limitar a indicarte lo que yo haría pra ordenar una lista genérica del tipo List(Of Asunto), para ordenar sus elementos por una propiedad del tipo de dato DateTime.

    Para ello tienes que crear una clase que implemente la interfaz IComparer(Of Asunto), para que cuando llames al método Sort de la lista genérica, ésta se pueda ordenar ascendente o descendentemente por los valores de fecha.

    Inserta en tu proyecto la siguiente clase amigable (Friend):

    Imports System.Collections.Generic
    Friend Class DateTimeComparer
     
     Implements IComparer(Of Asunto)
     
     Private sortOrderModifier As Integer = 1
     
     Public Sub New(sortOrder As SortOrder)
      
      If (sortOrder = sortOrder.Descending) Then
       sortOrderModifier = -1
       
      ElseIf (sortOrder = sortOrder.Ascending) Then
       sortOrderModifier = 1
       
      End If
      
     End Sub
     
     Public Function Compare(x As Asunto, y As Asunto) As Integer _
      Implements IComparer(Of Asunto).Compare
      Dim t1 As DateTime = x.Fecha
      Dim t2 As DateTime = y.Fecha
      
      Dim compareResult As Integer = DateTime.Compare(t1, t2)
      
      ' Si las fechas son iguales, la ordenación se basará
      ' en el valor de la primera fecha.
      '
      If (compareResult = 0) Then
       compareResult = String.Compare( _
        Convert.ToString(t1), _
        Convert.ToString(t2))
      End If
      
      Return compareResult * sortOrderModifier
      
     End Function
     
    End Class

    Ahora, vamos a escribir una pequeña clase Asunto solamente a los efectos prácticos del ejemplo que estoy mostrando:

    Public Class Asunto
     
     Public Sub New(fecha As DateTime)
      Me.Fecha = fecha
     End Sub
     
     Public Property Titulo As String
     Public Property Fecha As DateTime
       
    End Class

    Ya sólo queda poner en práctica la ordenación de una serie de elementos Asunto existente en una lista genérica del tipo List(Of Asunto). Para ello, en el evento Click de un simple control Button ejecutarías

     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      
      ' Una lista genérica de objetos Asunto
      '
      Dim lst As New List(Of Asunto)
      
      ' Añadimos objetos Asunto a la lista. Las fechas
      ' se especifican como literales con el formato
      ' mes/día/año.
      '
      lst.Add(New Asunto(#01/06/2013#))
      lst.Add(New Asunto(#12/12/2010#))
      lst.Add(New Asunto(#02/21/2013#))
      lst.Add(New Asunto(#12/31/2011#))
      lst.Add(New Asunto(#02/02/2012#))
      lst.Add(New Asunto(#01/01/2013#))
      
      ' Ordenamos la lista ascendentemente.
      '
      lst.Sort(New DateTimeComparer(SortOrder.Ascending))
      
      ' Mostramos el resultado en un control ListBox
      '
      listBox1.DataSource = lst
      listBox1.DisplayMember = "Fecha"  
     End Sub

    Si deseas ordenar las fechas en orden descendente, llamarías al método Sort

        ' Ordenamos la lista descendentemente.
        lst.Sort(New DateTimeComparer(SortOrder.Descending))

    ¡Eso es todo! Adapta el ejemplo a tus necesidades.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    jueves, 21 de febrero de 2013 11:15
    Moderador
  • Prueba con esta sentencia:

    miColeccion=(From asunto in miColeccion

    select asunto order by asunto.Fecha).ToList()

    jueves, 21 de febrero de 2013 12:18
  • hola

    no te animas a usar linq ? porque seria muy simple

    Dim list As New List(Of Tipo)
    
    'aqui cargas la lista
    
    list = list.OrderBy(Function(x) x.Fecha).ToList()


    asi de facil, puedes asignar a la misma lista o si quieres a una nueva

    Dim listOrdenada As List(Of Tipo) = list.OrderBy(Function(x) x.Fecha).ToList()

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina



    jueves, 21 de febrero de 2013 12:57

Todas las respuestas

  • "Nicolas Bringa" escribió:

    > tengo una coleccion de obj asuntos , donde cada asunto tiene
    > una propiedad que es fecha , quiero saber como hago para
    > ordenar esa coleccion de asuntos por fecha !

    Hola, Nicolás:

    Como no has indicado qué tipo de colección estás utilizando, simplemente me voy a limitar a indicarte lo que yo haría pra ordenar una lista genérica del tipo List(Of Asunto), para ordenar sus elementos por una propiedad del tipo de dato DateTime.

    Para ello tienes que crear una clase que implemente la interfaz IComparer(Of Asunto), para que cuando llames al método Sort de la lista genérica, ésta se pueda ordenar ascendente o descendentemente por los valores de fecha.

    Inserta en tu proyecto la siguiente clase amigable (Friend):

    Imports System.Collections.Generic
    Friend Class DateTimeComparer
     
     Implements IComparer(Of Asunto)
     
     Private sortOrderModifier As Integer = 1
     
     Public Sub New(sortOrder As SortOrder)
      
      If (sortOrder = sortOrder.Descending) Then
       sortOrderModifier = -1
       
      ElseIf (sortOrder = sortOrder.Ascending) Then
       sortOrderModifier = 1
       
      End If
      
     End Sub
     
     Public Function Compare(x As Asunto, y As Asunto) As Integer _
      Implements IComparer(Of Asunto).Compare
      Dim t1 As DateTime = x.Fecha
      Dim t2 As DateTime = y.Fecha
      
      Dim compareResult As Integer = DateTime.Compare(t1, t2)
      
      ' Si las fechas son iguales, la ordenación se basará
      ' en el valor de la primera fecha.
      '
      If (compareResult = 0) Then
       compareResult = String.Compare( _
        Convert.ToString(t1), _
        Convert.ToString(t2))
      End If
      
      Return compareResult * sortOrderModifier
      
     End Function
     
    End Class

    Ahora, vamos a escribir una pequeña clase Asunto solamente a los efectos prácticos del ejemplo que estoy mostrando:

    Public Class Asunto
     
     Public Sub New(fecha As DateTime)
      Me.Fecha = fecha
     End Sub
     
     Public Property Titulo As String
     Public Property Fecha As DateTime
       
    End Class

    Ya sólo queda poner en práctica la ordenación de una serie de elementos Asunto existente en una lista genérica del tipo List(Of Asunto). Para ello, en el evento Click de un simple control Button ejecutarías

     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      
      ' Una lista genérica de objetos Asunto
      '
      Dim lst As New List(Of Asunto)
      
      ' Añadimos objetos Asunto a la lista. Las fechas
      ' se especifican como literales con el formato
      ' mes/día/año.
      '
      lst.Add(New Asunto(#01/06/2013#))
      lst.Add(New Asunto(#12/12/2010#))
      lst.Add(New Asunto(#02/21/2013#))
      lst.Add(New Asunto(#12/31/2011#))
      lst.Add(New Asunto(#02/02/2012#))
      lst.Add(New Asunto(#01/01/2013#))
      
      ' Ordenamos la lista ascendentemente.
      '
      lst.Sort(New DateTimeComparer(SortOrder.Ascending))
      
      ' Mostramos el resultado en un control ListBox
      '
      listBox1.DataSource = lst
      listBox1.DisplayMember = "Fecha"  
     End Sub

    Si deseas ordenar las fechas en orden descendente, llamarías al método Sort

        ' Ordenamos la lista descendentemente.
        lst.Sort(New DateTimeComparer(SortOrder.Descending))

    ¡Eso es todo! Adapta el ejemplo a tus necesidades.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    jueves, 21 de febrero de 2013 11:15
    Moderador
  • Prueba con esta sentencia:

    miColeccion=(From asunto in miColeccion

    select asunto order by asunto.Fecha).ToList()

    jueves, 21 de febrero de 2013 12:18
  • hola

    no te animas a usar linq ? porque seria muy simple

    Dim list As New List(Of Tipo)
    
    'aqui cargas la lista
    
    list = list.OrderBy(Function(x) x.Fecha).ToList()


    asi de facil, puedes asignar a la misma lista o si quieres a una nueva

    Dim listOrdenada As List(Of Tipo) = list.OrderBy(Function(x) x.Fecha).ToList()

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina



    jueves, 21 de febrero de 2013 12:57