2017-10-06 2 views
0

J'ai une liste de valeurs de datedate de tri personnalisé

10/06/2017, 20.04.12, 13.07.12, 08.02.12, 04.05.13, 27.11.12

qui doit être trié dans l'ordre chronologique correct.

Le format de l'entrée de données d'origine n'a pas été contrôlé et est donc variable. Date séparateurs, jusqu'à présent, ont montré être «. et '/'. Le nombre de chiffres dans chaque segment de date n'est pas cohérent.

Cette liste représente une seule colonne de données dans un tableau. Les données sont lues à partir de sources variées et peuvent être mises dans n'importe quelle structure qui facilitera le tri. La date doit trier la table entière. Les données doivent rester telles que saisies à l'origine, donc je ne peux pas simplement convertir les données et en avoir fini avec elles.

+3

Ceci est un peu vague - est-ce une liste ou une table ou un datatable? Les dates doivent en fait être des chaînes ce qui est très problématique. Vous pouvez créer un nouveau champ/colonne/élément qui est la valeur analysée et trier par cela sans changer les données réelles – Plutonix

Répondre

1

est ici une fonction et une surcharge qui fonctionnera soit avec une chaîne que vous avez fourni, ou une liste de chaînes:

Private Function getSortedDates(input As String) As IEnumerable(Of DateTime) 
    Return getSortedDates(input.Split({","c}, StringSplitOptions.RemoveEmptyEntries)) 
End Function 

Private Function getSortedDates(input As IEnumerable(Of String)) As IEnumerable(Of DateTime) 
    Return input. 
     Select(Function(s As String) DateTime.Parse(s.Replace(".", "/"))). 
     OrderBy(Function(d) d) 
End Function 

Utilisation:

Sub Main() 
    ' as a string 
    Dim input1 = "10/06/2017, 4/20/12, 7/13/12, 08.02.12, 04.05.13, 11.27.12" 
    Dim output1 = getSortedDates(input1) 
    ' as an array 
    Dim input2 = {"10/06/2017", "4/20/12", "7/13/12", "08.02.12", "04.05.13", "11.27.12"} 
    Dim output2 = getSortedDates(input2) 
    ' output1 and output2 have the same sorted dates. 
End Sub 
0

Vous pouvez construire un comparateur personnalisé qui peut être utilisé dans le tri

Module Module1 

    Sub Main() 

     Dim dates() As String = {"10/06/2017", "4/20/12", "7/13/12", "08.02.12", "04.05.13", "11.27.12"} 

     Array.Sort(dates, New StringDateSorter) 

     For Each d In dates 
      Console.WriteLine(d) 
     Next 

    End Sub 

End Module 

Class StringDateSorter 
    Implements IComparer(Of String) 

    Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare 
     Dim d1 = Date.Parse(x) 
     Dim d2 = Date.Parse(y) 
     Return Date.Compare(d1, d2) 

    End Function 
End Class