【问题标题】:Sorting the result of Directory.GetFiles in vb.net在 vb.net 中对 Directory.GetFiles 的结果进行排序
【发布时间】:2014-03-24 17:27:30
【问题描述】:

我有一个目录包含所有 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()

但是在使用 for 每个循环进行检索时,我得到的结果如下 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..so 中提交文件,所以这就是我遇到问题的原因......

请帮帮我...

【问题讨论】:

  • This answer 看起来值得一试。
  • 如果最终结果相同,顺序真的重要吗?
  • 如果最终结果相同,那么也可以...

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


【解决方案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)))

如果您不关心将其保留为数组,则可能需要使用 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)

【讨论】:

  • Array.Sort 方法我在函数“预期表达式”下方出现错误,并且在 GetFileInfoSortKey 函数“预期语句结束”下方也出现错误
  • 您必须使用无法识别 lambda 表达式的旧版 Visual Studio。是否有某些原因导致您无法升级到更新的版本?即使使用最新版本的 Visual Studio,您仍然可以将项目定位于 .NET Framework 的最早版本。然而,后来的编译器支持 Lambda 表达式,即使针对早期的框架也是如此。因此,如果您有较新版本的 Visual Studio,即使在目标为 2.0 时也可以使用 lambda 表达式。
  • @Saurabh 如果您无法升级 Visual Studio,我更新了我的答案以展示如何在没有 lambda 表达式的情况下做同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多