我创建了一个StrCmpLogicalW / shlwapi.dll的分拣机.不幸的是,它会导致部分信任环境出错.我非常需要一个不使用’shlwapi.dll’或StrCmpLogicalW并且以相同方式工作的解决方案.
请HELPPPPP!
这是导致错误的分拣机.
- 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
这应该工作:
- 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,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“是: