Hallo,
ich habe den Hinweis von Dave umgesetzt und nachdem die ersten Zahlen verglichen wurden, im verbleibenden "Rest" nach weiteren Zahlen gesucht - es funktioniert.
Für alle, die es interessiert, hier die Lösung:
Public Sub FillTreeNode(ByVal DrvNode As TreeNode)
Try
Dim DI As New DirectoryInfo(DrvNode.FullPath)
Dim DirInfos() As DirectoryInfo = DI.GetDirectories
' Sortierung aufrufen
Array.Sort(DirInfos, New DirNameComparer)
.....
Catch
End Try
End Sub
' Sortierung
Public Function Compare(ByVal x As DirectoryInfo, ByVal y As DirectoryInfo) _
As Integer Implements IComparer(Of DirectoryInfo).Compare
Dim Z As Integer
Dim xNumber1 As String
Dim xNumber2 As String
Dim yNumber1 As String
Dim yNumber2 As String
Dim xval As Integer
Dim yval As Integer
Dim CI As CompareInfo = CompareInfo.GetCompareInfo("de-DE")
' Zahlen aus den zu vergleichenden Strings auslesen:
Dim xPos1 As Integer = _
x.Name.IndexOfAny(New Char() {"0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, _
"7"c, "8"c, "9"c})
' Zweiter String: Position der ersten Ziffer feststellen
Dim yPos1 As Integer = _
y.Name.IndexOfAny(New Char() {"0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, _
"7"c, "8"c, "9"c})
' Ziffern müssen an derselben Position innnerhalb der zu vergleichenden
' Strings stehen
If xPos1 > -1 AndAlso yPos1 > -1 AndAlso xPos1 = yPos1 Then
' Die zu vergleichenden Strings müssen bis zu den gefundenen
' Ziffern gleich sein ('Hardrock' soll nicht mit 'Hartrock'
' verglichen werden)
If x.Name.ToLower.StartsWith(y.Name.ToLower.Substring(0, yPos1)) _
Then
' Zahlen können 1-, 2- usw.-stellig sein: Stellenanzahl
' feststellen
' Im ersten String
For Z = xPos1 To x.Name.Length - 1
If Not IsNumeric(x.Name.Substring(Z, 1)) Then Exit For
Next
' Zahl aus erstem String isolieren (Z - xPos1 = Stellenanzahl)
xNumber1 = x.Name.Substring(xPos1, Z - xPos1)
' Und im zweiten String
For Z = yPos1 To y.Name.Length - 1
If Not IsNumeric(y.Name.Substring(Z, 1)) Then Exit For
Next
yNumber1 = y.Name.Substring(yPos1, Z - yPos1)
' Isolierte Zahlen mit TryParse als Integerwerte vergleichen
If Integer.TryParse(xNumber1, xval) AndAlso Integer.TryParse( _
yNumber1, yval) Then
' Isolierte Zahlen identisch - jetzt nach den CD-Nummern
' suchen
If xval = yval Then
' Zu vergleichende Strings hinter erster Zahl
Dim xSubStr As String = x.Name.Substring(xPos1 + _
xNumber1.Length)
Dim ySubStr As String = y.Name.Substring(yPos1 + _
yNumber1.Length)
Dim xPos2 As Integer = _
xSubStr.IndexOfAny(New Char() {"0"c, "1"c, "2"c, "3"c, _
"4"c, "5"c, "6"c, "7"c, "8"c, "9"c})
Dim yPos2 As Integer = _
ySubStr.IndexOfAny(New Char() {"0"c, "1"c, "2"c, "3"c, _
"4"c, "5"c, "6"c, "7"c, "8"c, "9"c})
' Wenn weitere Zahlen in den SubStr vorhanden
If xPos2 > -1 AndAlso yPos2 > -1 AndAlso xPos2 = _
yPos2 Then
For Z = xPos2 To xSubStr.Length - 1
If Not IsNumeric(xSubStr.Substring(Z, 1)) Then _
Exit For
Next
xNumber2 = xSubStr.Substring(xPos2, Z - xPos2)
For Z = yPos2 To ySubStr.Length - 1
If Not IsNumeric(ySubStr.Substring(Z, 1)) Then _
Exit For
Next
yNumber2 = ySubStr.Substring(yPos2, Z - yPos2)
If Integer.TryParse(xNumber2, xval) AndAlso _
Integer.TryParse(yNumber2, yval) Then
Return (xval.CompareTo(yval))
Else
Return (CI.Compare(x.Name, y.Name))
End If
End If
Else
Return xval.CompareTo(yval)
End If
Else
Return xval.CompareTo(yval)
End If
Else
Return CI.Compare(x.Name, y.Name)
End If
Else
Return CI.Compare(x.Name, y.Name)
End If
End Function Viele Grüße
Bitscheucher |