1

我有一个目录包含所有 tif 格式文件,大约有 30 个文件,其名称类似于 B_1、B_2...upto B_15 和 F_1、F_2...upto 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

我已经实现了一切都意味着加入 tiff,但是文件以 B 和 F 开头,我存储在各自的 arrayList 中,但是由于在 B_,B_10 中提交文件 ..所以这就是我遇到问题的原因......

请帮我...

4

1 回答 1

1

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

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)))

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

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)
于 2014-03-24T17:41:25.813 回答