我正在尝试按以下顺序对以下文件进行排序:
TMP_SDF_1180741.PDF
TMP_SDF_1179715.PDF
TMP_SDF_1162371.PDF
TMP_SDF_1141511.PDF
TMP_SDF_1131750.PDF
TMP_SDF_1117362.PDF
TMP_SDF_1104199.PDF
TMP_SDF_1082698.PDF
TMP_SDF_1062921.PDF
TMP_SDF_1043875.PDF
TMP_SDF_991514.PDF
TMP_SDF_970621.PDF
TMP_SDF_963154.PDF
TMP_SDF_952954.PDF
TMP_SDF_948067.PDF
TMP_SDF_917669.PDF
TMP_SDF_904315.PDF
TMP_SDF_899902.PDF
TMP_SDF_892398.PDF
TMP_SDF_882024.PDF
但实际输出是这样的:
TMP_SDF_991514.PDF
TMP_SDF_970621.PDF
TMP_SDF_963154.PDF
TMP_SDF_952954.PDF
TMP_SDF_948067.PDF
TMP_SDF_917669.PDF
TMP_SDF_904315.PDF
TMP_SDF_899902.PDF
TMP_SDF_892398.PDF
TMP_SDF_882024.PDF
TMP_SDF_1180741.PDF
TMP_SDF_1179715.PDF
TMP_SDF_1162371.PDF
TMP_SDF_1141511.PDF
TMP_SDF_1131750.PDF
TMP_SDF_1117362.PDF
TMP_SDF_1104199.PDF
TMP_SDF_1082698.PDF
TMP_SDF_1062921.PDF
TMP_SDF_1043875.PDF
我试过通过GetFiles研究排序方法,但是当我应用它们时,我得到的系统集合错误无法绑定到一维数组,这令人沮丧。这是我的代码:
Dim di As New IO.DirectoryInfo("C:\temp")
Dim aryFi As IO.FileInfo() = di.GetFiles("*.PDF")
Dim fi As IO.FileInfo
For Each fi In aryFi
My.Computer.FileSystem.RenameFile("C:\TEMP\" & fi.Name, listBox1.SelectedItem.ToString & ".pdf")
listBox1.SelectedIndex = listBox1.SelectedIndex - 1
Next
我正在将文件重命名为a1 a2 a3等,这样当我在PDF中组合时,它们按时间顺序排列。我想要排序的方式,将按时间顺序排列。我相信有一种更简单的方法。如您所知,PDF文件(1180741)中的数字越高,文件内容的最新日期。而882024将是最早的文件内容。
答案 0 :(得分:2)
正如评论中所述,您需要按数字而不是按字母顺序对它们进行排序。我不知道Windows资源管理器使用的特定排序算法,或者它是否可以使用相同的库,但是它当然可以编写您自己的算法,然后根据需要进行排序
这样做的第一步是仅提取要用作排序键的数字部分。在不了解更多细节的情况下,很难说出最佳选择是什么。如果您知道该数字始终从字符串中的特定字符位置开始,则只需使用String.SubString
即可。如果它始终由" _"和"。"你可以使用String.Split
。如果您需要更复杂的东西,或者您需要可配置解析规则,您可能需要考虑使用RegEx。例如,这是一个使用String.Split
的简单示例方法:
Public Function GetSortKey(fileName As String) As Integer
Return Integer.Parse(fileName.Split({"_"c, "."c})(2))
End Function
一旦你有一个提取给定文件名的排序键的方法,你就可以用它来对它们进行排序:
di.GetFiles("*.PDF").OrderBy(Function(x) GetSortKey(x.Name))
答案 1 :(得分:0)
也许你可以利用手上的一些工具
Dim reg As RegEx = new RegEx("\d+")
Dim ordered = new List(Of OrderedFiles)()
for each s in Directory.GetFiles("C:\temp", "*.PDF")
Dim aFile = new OrderedFiles()
aFile.FileName = s
aFile.Sequence = Convert.ToInt32(reg.Match(s).Value)
ordered.Add(aFile)
Next
for each aFile in ordered.OrderByDescending(Function(x) x.Sequence)
Console.WriteLine(Path.GetFileName(aFile.FileName))
Next
End Sub
Class OrderedFiles
Public FileName as String
Public Sequence as Integer
End Class
在此示例中,您有一个自定义类,其中包含要排序的文件名和数字部分。然后,将匹配文件中任何数值的Regex表达式应用于您的文件,以使用名称和数字部分构建类的实例。在循环结束时,只需调用Linq方法,该方法按降序排列列表