gpt4 book ai didi

vb.net - 如何按文件名和编号排序文件列表?

转载 作者:行者123 更新时间:2023-12-01 22:26:27 24 4
gpt4 key购买 nike

我在一个目录中有一堆文件,我试图根据它们的类型获取这些文件。一旦我有了它们,我想按文件名对它们进行排序(它们中有一个数字,我想这样排序)

我返回的文件是:

file-1.txt
file-2.txt
...
file-10.txt
file-11.txt
...
file-20.txt

但我得到它们的顺序看起来更接近于此:

file-1.txt
file-10.txt
file-11.txt
...
file-2.txt
file-20.txt

现在我正在使用 Directory.GetFiles() 并尝试使用 linq OrderBy 属性。但是,我无法像上面的第一个列表那样订购我的文件列表。

Directory.GetFiles() 似乎正在返回一个字符串列表,因此我无法获取文件属性列表,例如 filenamename.

这是我目前的代码:

documentPages = Directory.GetFiles(documentPath, "*.txt").OrderBy(Function(p) p).ToList()

有没有人有什么想法?

最佳答案

听起来您可能正在寻找“NaturalSort” - 文件资源管理器用于对包含数字的文件名进行排序的显示类型。为此,您需要一个自定义比较器:

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))

结果(一行以节省空间):

Before: file-1.txt, file-10.txt, file-11.txt, file-19.txt, file-2.txt, file-20.txt, file-3.txt, file-9.txt, file-99.txt
After: file-1.txt, file-2.txt, file-3.txt, file-9.txt, file-10.txt, file-11.txt, file-19.txt, file-20.txt, file-99.txt

这样做的一个优点是它不依赖于特定的模式或编码。它更通用,可以处理文本中的一组以上数字:

Game of Thrones\4 - A Feast For Crows\1 - Prologue.mp3
Game of Thrones\4 - A Feast For Crows\2 - The Prophet.mp3
...
Game of Thrones\4 - A Feast For Crows\10 - Brienne II.mp3
Game of Thrones\4 - A Feast For Crows\11 - Sansa.mp3


自然字符串排序 非常方便,我个人不介意通过创建扩展来污染 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()

关于vb.net - 如何按文件名和编号排序文件列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33785180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com