不使用StrCmpLogicalW或shlwapi.dll以数字和字母顺序(如Windows资源管理器)对数组进行排序 – ASP.NET VB

前端之家收集整理的这篇文章主要介绍了不使用StrCmpLogicalW或shlwapi.dll以数字和字母顺序(如Windows资源管理器)对数组进行排序 – ASP.NET VB前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我创建了一个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“是:

猜你在找的Windows相关文章