不使用StrCmpLogicalW或shlwapi.dll以数字和字母顺序(如Windows
发布时间:2020-12-13 20:38:32 所属栏目:Windows 来源:网络整理
导读:我创建了一个StrCmpLogicalW / shlwapi.dll的分拣机.不幸的是,它会导致部分信任环境出错.我非常需要一个不使用’shlwapi.dll’或StrCmpLogicalW并且以相同方式工作的解决方案. 请HELPPPPP! 这是导致错误的分拣机. Public Class nvSorter Implements ICompar
我创建了一个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“是: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- f# – 需要澄清有关Microsoft.FSharp.Data.TypeProviders的
- windows – Qt创建者调试模式真的很慢
- windows-7 – windows 7 powershell找不到dsquery和dsget
- windows-server-2003 – 完全格式化服务器以便在易趣上销售
- windows-server-2008 – Ram建议与SQL DB大小
- 如何使用windows命令行中的gimpfu运行python脚本?
- Windows 环境下如何安装 OpenSSL证书
- 克隆 – 适用于Windows的最佳服务器类幻像工具
- 如何在Windows 10中安装atari-py?
- 把域普通用户添加到本地管理员组的2种方法