在VB.NET中对字符串路径列表进行排序

时间:2010-08-14 09:50:34

标签: vb.net sorting path

我想对表示路径的字符串列表进行排序。排序结果将具有分层次序。

我的意思是:对于每个目录路径,我想在第一次列出该路径中的所有文件(字母或非字母无关紧要)。然后,将列出每个子目录路径。对于每个子目录,我想要所有文件......依此类推。

以下是一个例子:

(前)

emule/changelog.txt
emule/config/
emule/config/adresses.dat
emule/config/nodes.dat
emule/config/webservices.dat
emule/eMule.tmpl
emule/eMule_Chicane.tmpl
emule/license.txt
emule/license-GER.txt
emule/readme.txt
emule/Skin/
emule/Skin/Daan-V2-8.eMuleSkin.ini
emule/Skin/DaanV2-8/
emule/Skin/DaanV2-8/back.ICO
emule/Skin/DaanV2-8/WebServer.ico
emule/Template.eMuleSkin.ini
emule/webserver/
emule/webserver/add_server.gif
emule/webserver/arrow_down.gif
emule/webserver/arrow_right.gif
emule/webserver/yellow.gif
emule/emule.exe

(后)

emule/changelog.txt
emule/emule.exe
emule/eMule.tmpl
emule/eMule_Chicane.tmpl
emule/license.txt
emule/license-GER.txt
emule/readme.txt
emule/Template.eMuleSkin.ini
emule/config/
emule/config/adresses.dat
emule/config/nodes.dat
emule/config/webservices.dat
emule/Skin/
emule/Skin/Daan-V2-8.eMuleSkin.ini
emule/Skin/DaanV2-8/
emule/Skin/DaanV2-8/back.ICO
emule/Skin/DaanV2-8/WebServer.ico
emule/webserver/
emule/webserver/add_server.gif
emule/webserver/arrow_down.gif
emule/webserver/arrow_right.gif
emule/webserver/yellow.gif

我使用自定义IComparable函数尝试了许多像Array.Sort()这样的解决方案。

你知道吗?非常感谢。

编辑:这是我的IComparable方法

zipEntries.Sort(AddressOf compareZipEntryFilenames)

Private Function compareZipEntryFilenames(ByVal x As Object, ByVal y As Object) As Integer
        Dim one As String = CType(x, ZipEntry).FileName
        Dim two As String = CType(y, ZipEntry).FileName

        If Path.GetDirectoryName(one) = Path.GetDirectoryName(two) Then
            Return String.Compare(one, two)
        Else
           Select Regex.Matches(one, "/").Count.CompareTo(Regex.Matches(two, "/").Count)
                Case -1 'one has less / than two; so one then two
                    Return -1
                Case 1 'one has more / than two; so two then one
                    Return 1
                Case Else ' = 0, same number of /; so alphabetical sorting
                    Return String.Compare(one, two)
            End Select
        End If
    End Function

2 个答案:

答案 0 :(得分:1)

原来简单如下:

Private Function compareZipEntryFilenames(ByVal x As ZipEntry, ByVal y As ZipEntry) As Integer

    Dim res As Integer = String.Compare(Path.GetDirectoryName(x.FileName), Path.GetDirectoryName(y.FileName))

    If res = 0 Then
        Return String.Compare(x.FileName, y.FileName)
    Else
        Return res
    End If

End Function

答案 1 :(得分:0)

将以下内容插入发生排序的类中,然后使用zipEntries.Sort(new PathComparer)

private class PathComparer
        implements IComparer

     Public Function compareZipEntryFilenames(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
        Dim one As String = CType(x, ZipEntry).FileName
        Dim two As String = CType(y, ZipEntry).FileName

        If Path.GetDirectoryName(one) = Path.GetDirectoryName(two) Then
            Return String.Compare(one, two)
        Else
           Select Regex.Matches(one, "/").Count.CompareTo(Regex.Matches(two, "/").Count)
                Case -1 'one has less / than two; so one then two
                    Return -1
                Case 1 'one has more / than two; so two then one
                    Return 1
                Case Else ' = 0, same number of /; so alphabetical sorting
                    Return String.Compare(one, two)
            End Select
        End If
      End Function      
    end class