数组排序数字和字母(如Windows资源管理器),而无需使用StrCmpLogicalW或SHLWAPI.DLL - ASP.NET VB [英] Sorting arrays numerically and alphabetically(like Windows Explorer) without using StrCmpLogicalW or shlwapi.dll - ASP.NET VB

查看:147
本文介绍了数组排序数字和字母(如Windows资源管理器),而无需使用StrCmpLogicalW或SHLWAPI.DLL - ASP.NET VB的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个分拣机的StrCmpLogicalW / SHLWAPI.DLL。不幸的是它会导致部分信任环境中的错误。我是一个非常糟糕的需求的解决方案中,不使用'SHLWAPI.DLL或StrCmpLogicalW和作品以同样的方式。

请HELPPPPP!

下面是导致错误分拣机。

 公共类nvSorter
    实现的IComparer(串)    统一申报code函数库StrCmpLogicalWSHLWAPI.DLL(_
        BYVAL S1,作为字符串_
        BYVAL S2作为字符串)作为的Int32    公共功能比较(BYVAL x作为字符串,BYVALÿ作为字符串)作为整数器具System.Collections.Generic.IComparer(串).Compare
        返回StrCmpLogicalW(X,Y)
    结束功能末级


解决方案

这应该工作:

 公共类Form1的
    私人小组的button1_Click(BYVAL发件人为System.Object的,BYVAL E上System.EventArgs)把手Button1.Click
        暗淡的文件名()作为字符串=新字符串(){0,1,10,11,12,13,14,15,16,17 ,18,19,2,20,3,4,5,6,7,8,9}
        的Array.Sort(文件名,新CustomComparer)
        MessageBox.Show(的string.join(,文件名))
    结束小组
末级公共类CustomComparer
    实现的IComparer(串)    私人的位置作为整数
    私立秩序作为整数= 1    公共子新(可选BYVAL升序由于布尔=真)
        如果没有,那么升序
            为了= -1
        万一
    结束小组    私人共享功能EmptyText(BYVAL参考译文]字符串)为布尔
        返回String.Empty.Equals(多个)
    结束功能    公共功能比较(BYVAL x作为字符串,BYVALÿ作为字符串)作为整数器具System.Collections.Generic.IComparer(串).Compare
        昏暗RES1作为新的列表(串)(System.Text.RegularEx pressions.Regex.Split(X,(\\ D +),System.Text.RegularEx pressions.RegexOptions.IgnoreCase))
        昏暗RES2作为新的列表(串)(System.Text.RegularEx pressions.Regex.Split(Y(\\ D +),System.Text.RegularEx pressions.RegexOptions.IgnoreCase))
        res1.RemoveAll(AddressOf EmptyText)
        res2.RemoveAll(AddressOf EmptyText)
        位置= 0        对于每个XSTR作为字符串在RES1
            如果res2.Count>位置,然后
                如果不是则IsNumeric(XSTR)AndAlso运算不则IsNumeric(RES2(位置))然后
                    昏暗intresult作为整数=的String.Compare(XSTR,RES2(位置),真)
                    如果intresult<> 0,则
                        返回intresult *订购
                    其他
                        位置+ = 1
                    万一
                elseif的则IsNumeric(XSTR),而不是则IsNumeric(RES2(位置))然后
                    返回-1 *订购
                elseif的不则IsNumeric(XSTR)和则IsNumeric(RES2(位置))然后
                    返回1 *订购
                elseif的则IsNumeric(XSTR)和则IsNumeric(RES2(位置))然后
                    昏暗的资源作为整数= Decimal.Compare(Decimal.Parse(XSTR),Decimal.Parse(RES2(位置)))
                    如果解析度= 0,则
                        位置+ = 1
                    其他
                        返回水库*订购
                    万一
                万一
            其他
                返回-1 *订购
            万一
        下一个        返回1 *订购
    结束功能
末级

0,1,10,11,12,13,14,15,上面的分类例的结果16,17,18,19,2,20,3,4,5,6,7,8,9 是:

I created a sorter that StrCmpLogicalW / shlwapi.dll. unfortunately it causes errors on partial trust environments. I am in a really bad need of a solution that does not use 'shlwapi.dll' or StrCmpLogicalW and works in the same fashion.

PLEASE HELPPPPP !

Here's the sorter that causes the error.

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

解决方案

This should work:

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

The result of the above sorting example of "0", "1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "3", "4", "5", "6", "7", "8", "9" is:

这篇关于数组排序数字和字母(如Windows资源管理器),而无需使用StrCmpLogicalW或SHLWAPI.DLL - ASP.NET VB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆