VB.NET排序包含名称和日期的字符串,在字符串的日期对其进行排序

时间:2014-09-26 11:18:52

标签: vb.net sorting date

我的数据库中有数以千计的事务,这些事务都有映射到它们的事务键。 现在,我所做的是在我的应用程序中我有一个哈希表,其中我将每个事务映射到一个事务键。 所以哈希表可以说比如这个

 MYHASH(key-->transactionkey,value--->transaction object)

这里的问题是我的交易密钥是这样的

 transaction key=transaction type+date

其中交易类型可以是“实际”或“手动” 完成所有这些后,我将所有这些事务密钥存储在一个数组中,然后我调用Arrays.sort方法。

问题是Arrays.sort按字母顺序对它进行排序,所以Actual先来然后是manual,我需要的是它应该按日期而不是事务类型对键进行排序。

我无法更改交易密钥的生成方式,因为在我的程序中,我需要使用事务密钥进行更改。

有人可以建议在排序时可以做的事情。

1 个答案:

答案 0 :(得分:0)

Dim arr = New String() {"Actual2014/6/21", "Manual2014/5/12"}

arr = (From a In arr _
       Let datepos = a.LastIndexOf("/"c, a.LastIndexOf("/"c) - 1) - 4 _
       Order By _
         DateTime.Parse(Right(a, datepos)), _
         Left(a, datepos - 1) _
       Select a).ToArray()

为避免分配新数组,请单独定义排序函数并使用它:

Private Function CompareStupidKeys(ByVal x As String, ByVal y As String) As Integer
    Dim datepos_x = x.LastIndexOf("/"c, x.LastIndexOf("/"c) - 1) - 4
    Dim datepos_y = y.LastIndexOf("/"c, y.LastIndexOf("/"c) - 1) - 4

    Dim date_comparison = DateTime.Compare(DateTime.Parse(Right(x, datepos_x)), DateTime.Parse(Right(y, datepos_y)))
    If date_comparison = 0 Then
        Return String.Compare(Left(x, datepos_x - 1), Left(y, datepos_y - 1))
    Else
        Return date_comparison
    End If
End Function

....

Array.Sort(arr, AddressOf CompareStupidKeys)