2010-11-12 32 views
1

我創建了一個StrCmpLogicalW/shlwapi.dll分揀機。不幸的是,它會導致部分信任環境出錯。我非常需要一個不使用'shlwapi.dll'或者StrCmpLogicalW並且以相同方式工作的解決方案。在不使用StrCmpLogicalW或shlwapi.dll的情況下對數組進行數字和字母排序(如Windows資源管理器) - ASP.NET VB

請幫助!

下面是導致錯誤的分揀機。

Public Class nvSorter 
    Implements IComparer(Of String) 

    Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" (_ 
     ByVal s1 As String, _ 
     ByVal s2 As String) As Int32 

    Public Function Compare(ByVal x As String, ByVal y As String) As Integer Implements System.Collections.Generic.IComparer(Of String).Compare 
     Return StrCmpLogicalW(x, y) 
    End Function 

End Class 

回答

1

這應該工作:

Public Class Form1 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim Filenames() As String = New String() {"0", "1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "3", "4", "5", "6", "7", "8", "9"} 
     Array.Sort(Filenames, New CustomComparer) 
     MessageBox.Show(String.Join(",", Filenames)) 
    End Sub 
End Class 

Public Class CustomComparer 
    Implements IComparer(Of String) 

    Private Position As Integer 
    Private Order As Integer = 1 

    Public Sub New(Optional ByVal Ascending As Boolean = True) 
     If Not Ascending Then 
      Order = -1 
     End If 
    End Sub 

    Private Shared Function EmptyText(ByVal s As String) As Boolean 
     Return String.Empty.Equals(s) 
    End Function 

    Public Function Compare(ByVal x As String, ByVal y As String) As Integer Implements System.Collections.Generic.IComparer(Of String).Compare 
     Dim res1 As New List(Of String)(System.Text.RegularExpressions.Regex.Split(x, "(\d+)", System.Text.RegularExpressions.RegexOptions.IgnoreCase)) 
     Dim res2 As New List(Of String)(System.Text.RegularExpressions.Regex.Split(y, "(\d+)", System.Text.RegularExpressions.RegexOptions.IgnoreCase)) 
     res1.RemoveAll(AddressOf EmptyText) 
     res2.RemoveAll(AddressOf EmptyText) 
     Position = 0 

     For Each xstr As String In res1 
      If res2.Count > Position Then 
       If Not IsNumeric(xstr) AndAlso Not IsNumeric(res2(Position)) Then 
        Dim intresult As Integer = String.Compare(xstr, res2(Position), True) 
        If intresult <> 0 Then 
         Return intresult * Order 
        Else 
         Position += 1 
        End If 
       ElseIf IsNumeric(xstr) And Not IsNumeric(res2(Position)) Then 
        Return -1 * Order 
       ElseIf Not IsNumeric(xstr) And IsNumeric(res2(Position)) Then 
        Return 1 * Order 
       ElseIf IsNumeric(xstr) And IsNumeric(res2(Position)) Then 
        Dim res As Integer = Decimal.Compare(Decimal.Parse(xstr), Decimal.Parse(res2(Position))) 
        If res = 0 Then 
         Position += 1 
        Else 
         Return res * Order 
        End If 
       End If 
      Else 
       Return -1 * Order 
      End If 
     Next 

     Return 1 * Order 
    End Function 
End Class 

的上述分揀例子的"0", "1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "3", "4", "5", "6", "7", "8", "9"結果是:

alt text

+0

以下的代碼行中不給出錯誤 「ToList」 「System.Array」的成員: Dim res1 = System.Text.RegularExpressions.Regex.Split(x,「(\ d +)」,System.Text.RegularExpressions.RegexOpti ons.IgnoreCase).ToList Dim res2 = System.Text.RegularExpressions.Regex.Split(y,「(\ d +)」,System.Text.RegularExpressions.RegexOptions.IgnoreCase).ToList – Norman 2010-11-12 14:51:10

+0

未測試。瞬間... – 2010-11-12 15:07:36

+0

現在它應該工作,看看。 – 2010-11-12 15:16:43

相關問題