wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了不使用StrCmpLogicalW或shlwapi.dll以数字和字母顺序(如Windows资源管理器)对数组进行排序 – ASP.NET VB大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我创建了一个StrCmpLogicalW / shlwapi.dll的分拣机.不幸的是,它会导致部分信任环境出错.我非常需要一个不使用’shlwapi.dll’或StrCmpLogicalW并且以相同方式工作的解决方案. 请HelPPPPP! 这是导致错误的分拣机. Public Class nvSorter Implements IComparer(Of String) Dec
我创建了一个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 Cus@R_489_10608@omparer)
        messageBox.Show(String.Join(",",Filenames))
    End Sub
End Class

Public Class Cus@R_489_10608@omparer
    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“是:

大佬总结

以上是大佬教程为你收集整理的不使用StrCmpLogicalW或shlwapi.dll以数字和字母顺序(如Windows资源管理器)对数组进行排序 – ASP.NET VB全部内容,希望文章能够帮你解决不使用StrCmpLogicalW或shlwapi.dll以数字和字母顺序(如Windows资源管理器)对数组进行排序 – ASP.NET VB所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。