自定义日期排序
问题描述:
我有时间值的列表自定义日期排序
2017年10月6日,12年4月20日,12年7月13日,12年8月2日,13年5月4日,12年11月27日
需要按正确的时间顺序排序。
来自原始数据输入的格式未被控制,因此是可变的。迄今为止,日期分隔符显示为'。'。和'/'。每个日期段中的位数不一致。
该列表表示表中的单列数据。数据是从不同的来源读取的,可以放入任何便于分类的结构中。日期必须对整个表进行排序。
数据必须保持最初输入的状态,所以我不能简单地转换数据并完成它。
答
这里是一个功能和过载将与一个字符串按照您提供的,或字符串列表:
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
这有点含糊 - 它是一个列表,一个表还是一个数据表?日期实际上是非常有问题的字符串。您可以创建一个新的字段/列/元素,这是解析的值并按照该值进行排序,而无需更改实际数据 – Plutonix