自定义日期排序

自定义日期排序

问题描述:

我有时间值的列表自定义日期排序

2017年10月6日,12年4月20日,12年7月13日,12年8月2日,13年5月4日,12年11月27日

需要按正确的时间顺序排序。

来自原始数据输入的格式未被控制,因此是可变的。迄今为止,日期分隔符显示为'。'。和'/'。每个日期段中的位数不一致。

该列表表示表中的单列数据。数据是从不同的来源读取的,可以放入任何便于分类的结构中。日期必须对整个表进行排序。

数据必须保持最初输入的状态,所以我不能简单地转换数据并完成它。

+3

这有点含糊 - 它是一个列表,一个表还是一个数据表?日期实际上是非常有问题的字符串。您可以创建一个新的字段/列/元素,这是解析的值并按照该值进行排序,而无需更改实际数据 – Plutonix

这里是一个功能和过载将与一个字符串按照您提供的,或字符串列表:

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 

用法:

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 

您可以建立一个自定义比较,可以用于排序

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