Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包含名称和日期的VB.NET排序字符串,按字符串的日期排序_Vb.net_Sorting_Date - Fatal编程技术网

包含名称和日期的VB.NET排序字符串,按字符串的日期排序

包含名称和日期的VB.NET排序字符串,按字符串的日期排序,vb.net,sorting,date,Vb.net,Sorting,Date,嗨,我的数据库中有数千个事务,它们都有一个映射到它们的事务键。 现在,我要做的是,在我的应用程序中,我有一个哈希表,我在其中存储映射到一个事务键的每个事务。 比如说,哈希表如下所示 MYHASH(key-->transactionkey,value--->transaction object) transaction key=transaction type+date 这里的问题是,我的事务密钥是这样制作的 MYHASH(key-->transactionkey,va

嗨,我的数据库中有数千个事务,它们都有一个映射到它们的事务键。 现在,我要做的是,在我的应用程序中,我有一个哈希表,我在其中存储映射到一个事务键的每个事务。 比如说,哈希表如下所示

 MYHASH(key-->transactionkey,value--->transaction object)
 transaction key=transaction type+date
这里的问题是,我的事务密钥是这样制作的

 MYHASH(key-->transactionkey,value--->transaction object)
 transaction key=transaction type+date
其中交易类型可以是“实际”或“手动” 完成所有这些之后,我将所有这些事务键存储在一个数组中,然后调用Arrays.sort方法

问题是Arrays.sort按字母顺序对其排序,所以实际值先出现,然后是手动值,我需要的是它应该按日期而不是事务类型对键进行排序

我不能更改事务密钥的生成方式,因为这将需要在我使用过事务密钥的程序中的任何地方进行更改

有人能提出一些在分类时可以做的事情吗

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)

你能解释一下你的代码是做什么的吗?我对vb.net比较陌生,所以不知道arr在这里是什么意思。
arr
表示你的事务密钥数组,你说你有(并试图输入到
array.Sort
arr 
是带有的。如果你有足够新的VB.NET,你可以省略延续符号。非常感谢你的回答,你的代码对我来说非常好,只是做了一些小的改动。这很好,但是如果你在同一个列表/数组中排序记录,其中有些有日期,有些有日期和时间,有些没有(只是字符串)呢?没有时间的Coolmacdude约会实际上是以一天中的午夜为时间。然后您决定如何将没有日期的与有日期的进行比较,并在
CompareStupidKeys
或linq查询中反映这些更改,例如
orderbyhasdate(…)、DateTime.Parse(…)