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

前端之家收集整理的这篇文章主要介绍了不使用StrCmpLogicalW或shlwapi.dll以数字和字母顺序(如Windows资源管理器)对数组进行排序 – ASP.NET VB前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我创建了一个StrCmpLogicalW / shlwapi.dll的分拣机.不幸的是,它会导致部分信任环境出错.我非常需要一个不使用’shlwapi.dll’或StrCmpLogicalW并且以相同方式工作的解决方案.

请HELPPPPP!

这是导致错误的分拣机.

  1. Public Class nvSorter
  2. Implements IComparer(Of String)
  3.  
  4. Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" ( _
  5. ByVal s1 As String,_
  6. ByVal s2 As String) As Int32
  7.  
  8. Public Function Compare(ByVal x As String,ByVal y As String) As Integer Implements System.Collections.Generic.IComparer(Of String).Compare
  9. Return StrCmpLogicalW(x,y)
  10. End Function
  11.  
  12. End Class
这应该工作:
  1. Public Class Form1
  2. Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
  3. 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"}
  4. Array.Sort(Filenames,New CustomComparer)
  5. MessageBox.Show(String.Join(",",Filenames))
  6. End Sub
  7. End Class
  8.  
  9. Public Class CustomComparer
  10. Implements IComparer(Of String)
  11.  
  12. Private Position As Integer
  13. Private Order As Integer = 1
  14.  
  15. Public Sub New(Optional ByVal Ascending As Boolean = True)
  16. If Not Ascending Then
  17. Order = -1
  18. End If
  19. End Sub
  20.  
  21. Private Shared Function EmptyText(ByVal s As String) As Boolean
  22. Return String.Empty.Equals(s)
  23. End Function
  24.  
  25. Public Function Compare(ByVal x As String,ByVal y As String) As Integer Implements System.Collections.Generic.IComparer(Of String).Compare
  26. Dim res1 As New List(Of String)(System.Text.RegularExpressions.Regex.Split(x,"(\d+)",System.Text.RegularExpressions.RegexOptions.IgnoreCase))
  27. Dim res2 As New List(Of String)(System.Text.RegularExpressions.Regex.Split(y,System.Text.RegularExpressions.RegexOptions.IgnoreCase))
  28. res1.RemoveAll(AddressOf EmptyText)
  29. res2.RemoveAll(AddressOf EmptyText)
  30. Position = 0
  31.  
  32. For Each xstr As String In res1
  33. If res2.Count > Position Then
  34. If Not IsNumeric(xstr) AndAlso Not IsNumeric(res2(Position)) Then
  35. Dim intresult As Integer = String.Compare(xstr,res2(Position),True)
  36. If intresult <> 0 Then
  37. Return intresult * Order
  38. Else
  39. Position += 1
  40. End If
  41. ElseIf IsNumeric(xstr) And Not IsNumeric(res2(Position)) Then
  42. Return -1 * Order
  43. ElseIf Not IsNumeric(xstr) And IsNumeric(res2(Position)) Then
  44. Return 1 * Order
  45. ElseIf IsNumeric(xstr) And IsNumeric(res2(Position)) Then
  46. Dim res As Integer = Decimal.Compare(Decimal.Parse(xstr),Decimal.Parse(res2(Position)))
  47. If res = 0 Then
  48. Position += 1
  49. Else
  50. Return res * Order
  51. End If
  52. End If
  53. Else
  54. Return -1 * Order
  55. End If
  56. Next
  57.  
  58. Return 1 * Order
  59. End Function
  60. End Class

上述排序示例“0”,“1”,“10”,“11”,“12”,“13”,“14”,“15”,“16”,“17”,“18的结果“,”19“,”2“,”20“,”3“,”4“,”5“,”6“,”7“,”8“,”9“是:

猜你在找的Windows相关文章