none
¿Cómo ordeno esta lista por fecha?

    Pregunta

  • Copia (03 Abr. 2016 - 09.03.11 p.m.).bak
    Copia (05 Abr. 2016 - 12.50.15 a.m.).bak
    Copia (05 Ago. 2016 - 12.07.14 a.m.).bak
    Copia (05 Ene. 2016 - 12.50.15 a.m.).bak
    Copia (05 Mar. 2016 - 12.58.38 a.m.).bak
    Copia (23 Ago. 2016 - 03.01.01 p.m.).bak
    Copia (23 Ago. 2016 - 12.07.22 a.m.).bak
    Copia (23 Ago. 2016 - 12.57.38 p.m.).bak
    Copia (23 Ago. 2016 - 12.58.38 a.m.).bak
    Copia (23 Ago. 2016 - 12.58.38 p.m.).bak
    Copia (24 Ago. 2016 - 09.03.11 a.m.).bak
    Copia (24 Ago. 2016 - 09.03.11 p.m.).bak
    Copia (24 Ago. 2016 - 10.07.04 p.m.).bak
    Copia (24 Ago. 2016 - 10.09.13 p.m.).bak
    Copia (24 Ago. 2016 - 10.11.41 p.m.).bak

    Quiero que se ordenen por fecha, así:

    Copia (05 Ene. 2016 - 12.50.15 a.m.).bak
    Copia (03 Abr. 2016 - 09.03.11 p.m.).bak
    Copia (05 Abr. 2016 - 12.50.15 a.m.).bak
    Copia (05 Mar. 2016 - 12.58.38 a.m.).bak
    Copia (05 Ago. 2016 - 12.07.14 a.m.).bak
    Copia (23 Ago. 2016 - 12.07.22 a.m.).bak
    Copia (23 Ago. 2016 - 12.58.38 a.m.).bak
    Copia (23 Ago. 2016 - 12.57.38 p.m.).bak
    Copia (23 Ago. 2016 - 12.58.38 p.m.).bak
    Copia (23 Ago. 2016 - 03.01.01 p.m.).bak
    Copia (24 Ago. 2016 - 09.03.11 a.m.).bak
    Copia (24 Ago. 2016 - 09.03.11 p.m.).bak
    Copia (24 Ago. 2016 - 10.07.04 p.m.).bak
    Copia (24 Ago. 2016 - 10.09.13 p.m.).bak
    Copia (24 Ago. 2016 - 10.11.41 p.m.).bak


    Suponiendo que la lista anterior esté contenida en: lisFechas as New List(Of String)

    O sea, quiero que se ordenen cronológicamente, no como texto. Creo que se hace a través de una función.

    Estoy tratando pero no logro que se ordenen de esa manera.


    • Editado James-2016 jueves, 25 de agosto de 2016 3:36
    jueves, 25 de agosto de 2016 3:35

Respuestas

  • Imports System.Globalization
    
    Module Module1
    
        Sub Main()
            Dim lista As New List(Of String)
    
            lista.Add("Copia(5.03.2016 - 03.45.16 p.m.).bak")
            lista.Add("Copia(5.01.2016 - 04.03.58 a.m.).bak")
            lista.Add("Copia(5.04.2016 - 12.32.45 a.m.).bak")
    
            lista = lista.OrderBy(Function(s) s, New Compara()).ToList
    
    
        End Sub
    
        Class Compara
            Implements IComparer(Of String)
    
            Dim ampm As CultureInfo
    
            Sub New()
                ampm = CultureInfo.CreateSpecificCulture(CultureInfo.InvariantCulture.Name)
                ampm.DateTimeFormat.AMDesignator = "a.m."
                ampm.DateTimeFormat.PMDesignator = "p.m."
            End Sub
    
            Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
                Dim f1 As DateTime = DateTime.ParseExact(x, "Copia(d.MM.yyyy - hh.mm.ss tt).bak", ampm)
                Dim f2 As DateTime = DateTime.ParseExact(y, "Copia(d.MM.yyyy - hh.mm.ss tt).bak", ampm)
    
                Return f1.CompareTo(f2)
            End Function
    
    
        End Class
    
    End Module


    Imports System.Globalization
    
    Module Module1
    
        Sub Main()
            Dim lista As New List(Of String)
    
            lista.Add("Copia(5 Ago. 2016 - 12.07.14 a.m.).bak")
            lista.Add("Copia(5 Ene. 2016 - 12.50.15 a.m.).bak")
            lista.Add("Copia(5 Mar. 2016 - 12.58.38 a.m.).bak")
    
            lista = lista.OrderBy(Function(s) s, New Compara()).ToList
    
    
        End Sub
    
        Class Compara
            Implements IComparer(Of String)
    
            Dim ampm As CultureInfo
    
            Sub New()
                ampm = CultureInfo.CreateSpecificCulture("es-ar")
                ampm.DateTimeFormat.AMDesignator = "a.m."
                ampm.DateTimeFormat.PMDesignator = "p.m."
            End Sub
    
            Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
                Dim f1 As DateTime = DateTime.ParseExact(x, "Copia(d MMM yyyy - hh.mm.ss tt).bak", ampm)
                Dim f2 As DateTime = DateTime.ParseExact(y, "Copia(d MMM yyyy - hh.mm.ss tt).bak", ampm)
    
                Return f1.CompareTo(f2)
            End Function
    
    
        End Class
    
    End Module
    

    • Editado miqui quilmes jueves, 25 de agosto de 2016 3:49
    • Marcado como respuesta James-2016 jueves, 25 de agosto de 2016 20:39
    jueves, 25 de agosto de 2016 3:38
  • Es porque se incluyen caracteres de formato. Una solución podría ser

    Imports System.Globalization
    
    Module Module1
    
        Sub Main()
            Dim lista As New List(Of String)
    
            lista.Add("BMD (5 Ago. 2016 - 12.07.14 a.m.).bak")
            lista.Add("BMD (5 Ene. 2016 - 12.50.15 a.m.).bak")
            lista.Add("BMD (5 Mar. 2016 - 12.58.38 a.m.).bak")
    
            lista = lista.OrderBy(Function(s) s, New Compara()).ToList
    
    
        End Sub
    
        Class Compara
            Implements IComparer(Of String)
    
            Dim ampm As CultureInfo
    
            Sub New()
                ampm = CultureInfo.CreateSpecificCulture("es-ar")
                ampm.DateTimeFormat.AMDesignator = "a.m."
                ampm.DateTimeFormat.PMDesignator = "p.m."
            End Sub
    
            Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
                Dim f1 As DateTime = DateTime.ParseExact(x, "'BMD' (d MMM yyyy - hh.mm.ss tt).bak", ampm)
                Dim f2 As DateTime = DateTime.ParseExact(y, "'BMD' (d MMM yyyy - hh.mm.ss tt).bak", ampm)
    
                Return f1.CompareTo(f2)
            End Function
    
    
        End Class
    
    End Module
    

    Incluso podrías agregar a la clase Compara, otras propiedades para establecer el texto anterior al de la fecha, el posterior, y la propia cadena de formato. Podrías agregar propiedades para modificar, por ejemplo, la lista de abreviaturas si es que no viene Abr. sino ABR, etc.

    • Marcado como respuesta James-2016 jueves, 25 de agosto de 2016 20:39
    jueves, 25 de agosto de 2016 17:53

Todas las respuestas

  • Imports System.Globalization
    
    Module Module1
    
        Sub Main()
            Dim lista As New List(Of String)
    
            lista.Add("Copia(5.03.2016 - 03.45.16 p.m.).bak")
            lista.Add("Copia(5.01.2016 - 04.03.58 a.m.).bak")
            lista.Add("Copia(5.04.2016 - 12.32.45 a.m.).bak")
    
            lista = lista.OrderBy(Function(s) s, New Compara()).ToList
    
    
        End Sub
    
        Class Compara
            Implements IComparer(Of String)
    
            Dim ampm As CultureInfo
    
            Sub New()
                ampm = CultureInfo.CreateSpecificCulture(CultureInfo.InvariantCulture.Name)
                ampm.DateTimeFormat.AMDesignator = "a.m."
                ampm.DateTimeFormat.PMDesignator = "p.m."
            End Sub
    
            Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
                Dim f1 As DateTime = DateTime.ParseExact(x, "Copia(d.MM.yyyy - hh.mm.ss tt).bak", ampm)
                Dim f2 As DateTime = DateTime.ParseExact(y, "Copia(d.MM.yyyy - hh.mm.ss tt).bak", ampm)
    
                Return f1.CompareTo(f2)
            End Function
    
    
        End Class
    
    End Module


    Imports System.Globalization
    
    Module Module1
    
        Sub Main()
            Dim lista As New List(Of String)
    
            lista.Add("Copia(5 Ago. 2016 - 12.07.14 a.m.).bak")
            lista.Add("Copia(5 Ene. 2016 - 12.50.15 a.m.).bak")
            lista.Add("Copia(5 Mar. 2016 - 12.58.38 a.m.).bak")
    
            lista = lista.OrderBy(Function(s) s, New Compara()).ToList
    
    
        End Sub
    
        Class Compara
            Implements IComparer(Of String)
    
            Dim ampm As CultureInfo
    
            Sub New()
                ampm = CultureInfo.CreateSpecificCulture("es-ar")
                ampm.DateTimeFormat.AMDesignator = "a.m."
                ampm.DateTimeFormat.PMDesignator = "p.m."
            End Sub
    
            Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
                Dim f1 As DateTime = DateTime.ParseExact(x, "Copia(d MMM yyyy - hh.mm.ss tt).bak", ampm)
                Dim f2 As DateTime = DateTime.ParseExact(y, "Copia(d MMM yyyy - hh.mm.ss tt).bak", ampm)
    
                Return f1.CompareTo(f2)
            End Function
    
    
        End Class
    
    End Module
    

    • Editado miqui quilmes jueves, 25 de agosto de 2016 3:49
    • Marcado como respuesta James-2016 jueves, 25 de agosto de 2016 20:39
    jueves, 25 de agosto de 2016 3:38
  • Muchas gracias por responder. El código proporcionado funciona bien, pero por qué cuando cambio la cadena Copia por RRR, funciona, pero cuando pongo BMD por ejemplo, salta un error?

    ¿Cómo debería hacer para que funcione poniendo BMD o cualquier otra cadena y que la tome literal?

    Pongo la imagen (a la izquierda sale la lista desordenada y a la derecha deberia salir la ordenada):



    • Editado James-2016 jueves, 25 de agosto de 2016 4:45
    jueves, 25 de agosto de 2016 4:42
  • Hola, puedes desplegar donde pone Detalles? Proporciona mas información. Si estás depurando ve a la siguiente opción de menú para que cuando se produzca una excepción, la ejecución del programa se detenga en la linea que la provoca

    Depurar/Excepciones/Marca casilla CommonRuntime language


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 25 de agosto de 2016 6:48
  • Es porque se incluyen caracteres de formato. Una solución podría ser

    Imports System.Globalization
    
    Module Module1
    
        Sub Main()
            Dim lista As New List(Of String)
    
            lista.Add("BMD (5 Ago. 2016 - 12.07.14 a.m.).bak")
            lista.Add("BMD (5 Ene. 2016 - 12.50.15 a.m.).bak")
            lista.Add("BMD (5 Mar. 2016 - 12.58.38 a.m.).bak")
    
            lista = lista.OrderBy(Function(s) s, New Compara()).ToList
    
    
        End Sub
    
        Class Compara
            Implements IComparer(Of String)
    
            Dim ampm As CultureInfo
    
            Sub New()
                ampm = CultureInfo.CreateSpecificCulture("es-ar")
                ampm.DateTimeFormat.AMDesignator = "a.m."
                ampm.DateTimeFormat.PMDesignator = "p.m."
            End Sub
    
            Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
                Dim f1 As DateTime = DateTime.ParseExact(x, "'BMD' (d MMM yyyy - hh.mm.ss tt).bak", ampm)
                Dim f2 As DateTime = DateTime.ParseExact(y, "'BMD' (d MMM yyyy - hh.mm.ss tt).bak", ampm)
    
                Return f1.CompareTo(f2)
            End Function
    
    
        End Class
    
    End Module
    

    Incluso podrías agregar a la clase Compara, otras propiedades para establecer el texto anterior al de la fecha, el posterior, y la propia cadena de formato. Podrías agregar propiedades para modificar, por ejemplo, la lista de abreviaturas si es que no viene Abr. sino ABR, etc.

    • Marcado como respuesta James-2016 jueves, 25 de agosto de 2016 20:39
    jueves, 25 de agosto de 2016 17:53
  • Gracias Sergio Parra por tu sugerencia, me interesa lo que me dices pero no encuentro la opción que me indicas. Tengo la versión VS 2015. Pongo una imagen.

    jueves, 25 de agosto de 2016 20:32
  • hola. Cierto es que supuse tendrías una vs 2013 o anterior. Lo siento. Ves en tu imagen a la derecha que pone Configuracion de Excepciones? Si pulsas ahí en la parte de abajo done las ventanas inmediato y demás te sale opciones para configurar. Te dejo este enlce para que lo veas. The New Exception Settings Window in Visual Studio 2015

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 25 de agosto de 2016 20:36
  • Muchas gracias por la ayuda, ya funciona como quería.

    Sin importar la configuración regional, esta línea la soluciona noo?

    ampm = CultureInfo.CreateSpecificCulture("es-ar")

    O sea, suponiendo que la configuración regional configure el reloj como 24 h, la línea anterior sin importar esa configuración regional tomaría a.m. y p.m. ¿cierto?

    ¿Lo mismo no ocurriría con la fecha? es decir la ordenación con el código proporcionado funcionará bien si la configuración regional estaría en inglés?

    ¿o para que funcione indistintamente habría que hacer algún cambio más?

    jueves, 25 de agosto de 2016 20:39
  • Aunque ya resolví el error en el código que consultaba, me interesa la sugerencia, ya lo configuré pero no noto mayor cambio, no noto que se detenga en la línea que genera el error.

    Por ejemplo modifiqué la línea para reproducir el error anterior y presiono Ctrl+F5 para ejecutarlo, presiono el botón que ejecuta el código que produce el error pero me sale igual (pongo la imagen) qué estoy haciendo mal? o sea por qué no se detiene en la línea que genera el error? (a lo mejor me falta alguna configuración)

    jueves, 25 de agosto de 2016 21:00
  • Creo que Ctrl+F5 te inicia ejecución del programa pero sin activar el Depurador, prueba a pulsar solo F5

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 25 de agosto de 2016 21:12
  • Probé con F5 pero ahora me sale esto:

    jueves, 25 de agosto de 2016 21:33