我有一个目录包含所有tif格式的文件,大约有30个文件的名字像B_1,B_2…直到B_15和F_1,F_2…到f。当我从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、F_10 F_11、F_12 F_13, F_14, F_15,₂,F_3……到F_9
但问题是我想要那种式样的B_1、B_2 B_3、B_4…B_9 B_10 B_11……B_15然后f、₂F_3、F_4…F_9 F_10, F_11……F_15
实际上我的任务是从目录中获取所有的文件,并加入所有的tiff文件f、B_1、₂、B_2…F_9 B_9, F_10, B_10, F_11, B_11,……F_15 B_15
我已经实现了一切都意味着加入tiff,但文件开始与B和F我存储在各自的数组列表,但由于在B_,B_10..这就是为什么我有问题…
最简单的解决方案是创建一个以字符串形式返回排序键的方法,例如,在您的情况下,这样做就足够了:
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)