听起来您可能正在寻找“自然排序” - 文件资源管理器用于对包含数字的文件名进行排序的显示类型。为此,您需要一个自定义比较器:
Imports System.Runtime.InteropServices
Partial Class NativeMethods
<DllImport("shlwapi.dll", CharSet:=CharSet.Unicode)>
Private Shared Function StrCmpLogicalW(s1 As String, s2 As String) As Int32
End Function
Friend Shared Function NaturalStringCompare(str1 As String, str2 As String) As Int32
Return StrCmpLogicalW(str1, str2)
End Function
End Class
Public Class NaturalStringComparer
Implements IComparer(Of String)
Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
Return NativeMethods.NaturalStringCompare(x, y)
End Function
End Class
用它来对你得到的结果进行排序:
Dim myComparer As New NaturalStringComparer
' OP post only shows the filename without path, so strip off path:
' (wont affect the result, just the display)
Dim files = Directory.EnumerateFiles(path_name_here).
Select(Function(s) Path.GetFileName(s)).ToList
Console.WriteLine("Before: {0}", String.Join(", ", files))
' sort the list using the Natural Comparer:
files.Sort(myComparer)
Console.WriteLine("After: {0}", String.Join(", ", files))
结果(一行以节省空间):
之前:file-1.txt、file-10.txt、file-11.txt、file-19.txt、file-2.txt、file-20.txt、file-3.txt、file-9.txt、文件-99.txt
之后:file-1.txt、file-2.txt、file-3.txt、file-9.txt、file-10.txt、file-11.txt、file-19.txt、file-20.txt、文件-99.txt
这样做的优点之一是它不依赖于特定的模式或编码。它更加通用,可以处理文本中的多个数字:
权力的游戏\4 - 群鸦的盛宴\1 - Prologue.mp3
权力的游戏\4 - 群鸦的盛宴\2 - 先知.mp3
...
权力的游戏\4 - 群鸦的盛宴\10 - 布蕾妮二世.mp3
权力的游戏\4 - 群鸦的盛宴\11 - 珊莎.mp3
A Natural String Sort
非常方便,我个人不介意通过创建扩展来污染 Intellisense:
' List<string> version
<Extension>
Function ToNaturalSort(l As List(Of String)) As List(Of String)
l.Sort(New NaturalStringComparer())
Return l
End Function
' array version
<Extension>
Function ToNaturalSort(a As String()) As String()
Array.Sort(a, New NaturalStringComparer())
Return a
End Function
现在使用更加容易:
Dim files = Directory.EnumerateFiles(your_path).
Select(Function(s) Path.GetFileName(s)).
ToList.
ToNaturalSort()
' or without the path stripping:
Dim files = Directory.EnumerateFiles(your_path).ToList.ToNaturalSort()