2010-08-14 20 views
2

我想對錶示路徑的字符串列表進行排序。排序結果將具有分層順序。VB.NET中字符串路徑的排序列表

我的意思是:對於每個目錄路徑,我希望在第一次列出該路徑中的所有文件(按字母順序排列或不是無關緊要)。然後,將列出每個子目錄路徑。對於每個子目錄,我想要所有文件...等等。

下面是一個例子:

(前)

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 

我試圖像的Array.Sort(許多解決方案)用自定義IComparable的功能。

你有什麼想法嗎?非常感謝。

編輯:這裏是我的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 
+0

請發佈您編寫的自定義IComparable方法。我認爲這是正確的做法。 – 2010-08-14 09:53:48

+0

它看起來像你的函數應該工作 - 但是,它不是'執行'IComparable.CompareTo。 – 2010-08-14 10:53:53

+0

沒有。問題是,在最後一步,在確定嵌套級別之後,應該比較目錄,而不是文件名。看到我的答案。此外,您不必實現接口,還有其他重載。 – GSerg 2010-08-14 11:28:59

回答

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 
+0

是啊!你很棒 - 你剛剛解決了我的問題!非常感謝 – user420280 2010-08-14 12:24:50

+0

順便說一句,有一件事我不明白。 Path.PathSeparator返回「;」c - 我認爲你用它來計算「/」,而不是「;」。所以,永遠不會有「;」在字符串中。 – user420280 2010-08-14 14:14:32

+0

哎。它的工作原理只是因爲它有一個錯誤。修復這個bug會破壞它。大。我將發佈固定版本。 – GSerg 2010-08-14 14:35:36

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 
+0

這是將IComparable鏈接到Sort()方法的另一種方法。因爲我不想添加類,所以我決定在我的項目類中創建一個函數。行爲是一樣的。 – user420280 2010-08-14 12:55:42

+0

整潔 - 我還沒有遇到Sort的比較(Of T)變體! – 2010-08-14 13:09:13