在vb.net中对Directory.GetFiles的结果进行排序

时间:2014-03-24 17:27:30

标签: vb.net file fileinfo system.io.fileinfo

我有一个目录包含所有tif格式文件,大约30个文件,其名称类似于B_1,B_2 ......高达B_15和F_1,F_2 ......高达F_1。 当我从getfile方法获取文件时。

    Dim di As New IO.DirectoryInfo("c:\ABC\")
    Dim diar1 As IO.FileInfo() = di.GetFiles()

但是在为每个循环重新使用时,我得到的结果就像 B_1,B_10,B_11,B_12,B_13,B_14,B_15,B_2,B_3 ...至B_9 相似 F_1,F_10,F_11,F_12,F_13,F_14,F_15,F_2,F_3 ......至F_9

但问题是 我希望在模式中像 B_1,B_2,B_3,B_4 ..... B_9,B_10,B_11 ...... B_15 然后 F_1,F_2,F_3,F_4 ..... F_9,F_10,F_11 ...... F_15

实际上我的任务是从目录中获取所有文件并加入所有tiff文件文件 F_1,B_1,F_2,B_2 ... F_9,B_9,F_10,B_10,F_11,B_11,.... F_15,B_15

我已经实现了everthing所有的手段加入tiff但是文件以B和F开头我存储在各自的arrayList中但是由于B_,B_10..so中的来文文件,这就是为什么我会遇到问题......

Plz帮助我......

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是创建一个方法,将一个排序键作为字符串返回,例如,在你的情况下,这样就足够了:

Public Function GetFileInfoSortKey(fi As FileInfo) As String
    Dim parts() As String = fi.Name.Split("_"c)
    Dim sortKey As String = Nothing
    If parts.Length = 2 Then
        sortKey = parts(1).PadLeft(10) & parts(0)
    Else
        sortKey = fi.Name
    End If
    Return sortKey
End Function

然后,您可以使用该方法轻松地对FileInfo个对象进行排序,如下所示:

Array.Sort(diar1, Function(x, y) GetFileInfoSortKey(x).CompareTo(GetFileInfoSortKey(y)))

如果您不关心将其保留为数组,则可能需要使用LINQ提供的OrderBy扩展方法:

Dim diar1 As IEnumerable(Of FileInfo) = di.GetFiles().OrderBy(Of String)(AddressOf GetFileInfoSortKey)

或者,如果您使用的是不支持 lambda表达式的旧版Visual Studio,则可以通过创建单独的比较器方法来实现,如下所示:

Public Function FileInfoComparer(x As FileInfo, y As FileInfo) As Integer
    Return GetFileInfoSortKey(x).CompareTo(GetFileInfoSortKey(y))
End Function

然后你可以使用比较器方法调用Array.Sort,如下所示:

Array.Sort(diar1, AddressOf FileInfoComparer)