我有一个目录包含所有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帮助我......
答案 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)