不幸的是,我的代碼有問題。在過去的幾個月里,我時不時地在我的程式中添加了一些東西。現在代碼有點“錯誤構建(t)”,我需要你的幫助。我有一個程式,其中有執行緒和帖子——就像在一個經典的互聯網論壇中一樣。一個執行緒可以包含多個帖子;一個帖子包含多個影像和文本。所以... 您可以單擊 ListBox 中的某個帖子并盡可能大地顯示其影像。這是通過單獨的表格完成的。使用 3 個不同的單選按鈕,我可以根據影像的大小(百萬像素)、修改日期或檔案名對其進行排序。為了能夠按百萬像素排序,我曾經創建了一個類Bildeigenschaften(影像屬性類)。因此sorted_List是一個List(of Bildeigenschaften). 今天,我發現按名稱排序與在 Windows 資源管理器中按名稱排序不同。Windows 資源管理器排序自然(我發現),所以它是這樣的
ABC9
ABC10
而不是在我的程式中
ABC10
ABC9
. 所以我得到了一些排序“自然”的代碼。我現在如何獲得這個鏈接?
表格
Private Property List_of_class_Bildeigenschaften As New List(Of Bildeigenschaften)
Private sorted_List As List(Of Bildeigenschaften)
'--------------------
Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton2.CheckedChanged
If RadioButton2.Checked Then
sorted_List = List_of_class_Bildeigenschaften.OrderBy(Function(o) o._FileInfo.Name).ToList()
If CheckBox1.Checked Then
sorted_List.Reverse()
End If
End If
If CheckBox1.Checked Then
sorted_List.Reverse()
End If
End Sub
'--------------------
Public Class NaturalComparer
Implements IComparer(Of String)
Private _pos As Integer
Private ReadOnly _order As Integer
Public Sub New(Optional Ascending As Boolean = True)
_order = If(Ascending, 1, -1)
End Sub
Private Shared Function RegexSplit(ByVal s As String) As String()
Return Regex.Split(s, "(\d )", RegexOptions.IgnoreCase)
End Function
Private Shared Function GetEmptyStrings() As Predicate(Of String)
Return Function(s) String.IsNullOrEmpty(s)
End Function
Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
Dim left As New List(Of String)(RegexSplit(x))
Dim right As New List(Of String)(RegexSplit(y))
left.RemoveAll(GetEmptyStrings())
right.RemoveAll(GetEmptyStrings())
_pos = 0
For Each x In left
If y.Count > _pos Then
If Not Decimal.TryParse(x, Nothing) AndAlso Not Decimal.TryParse(right(_pos), Nothing) Then
Dim result As Integer = String.Compare(x, right(_pos), True)
If result <> 0 Then
Return result * _order
Else
_pos = 1
End If
ElseIf Decimal.TryParse(x, Nothing) AndAlso Not Decimal.TryParse(right(_pos), Nothing) Then
Return -1 * _order
ElseIf Not Decimal.TryParse(x, Nothing) AndAlso Decimal.TryParse(right(_pos), Nothing) Then
Return 1 * _order
Else
Dim result As Integer = Decimal.Compare(Decimal.Parse(x), Decimal.Parse(right(_pos)))
If result = 0 Then
_pos = 1
Else
Return result * _order
End If
End If
Else
Return -1 * _order
End If
Next
Return _order
End Function
End Class
Bildeigenschaften 類
Public NotInheritable Class Bildeigenschaften
Public Megapixels As UInt32
Public Bild As System.Drawing.Bitmap
Public _FileInfo As IO.FileInfo
Public Sub New(ByVal Breite As UInt32, ByVal Hoehe As UInt32, ByVal Bild As Bitmap, ByVal einefileinfo As IO.FileInfo)
Me.Megapixels = Breite * Hoehe
Me.Bild = Bild
Me._FileInfo = einefileinfo
End Sub
End Class

因此,我的問題與此不相似。
uj5u.com熱心網友回復:
您可以使用StrCmpLogicalW資源管理器也使用的 Windows' :
Public Class NaturalSortComparer
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
例如:
Dim list = New List(Of String)
list.Add("ABC10")
list.Add("ABC9")
Console.WriteLine(String.Join(",", list))
list.Sort(New NaturalSortComparer())
Console.WriteLine(String.Join(",", list))
輸出:
ABC10,ABC9
ABC9,ABC10
您也可以將它與 LINQ 一起使用:
list = list.OrderBy(Function(s) s, New NaturalSortComparer()).ToList()
這也回答了您如何在查詢中安裝比較器的問題:
sorted_List = List_of_class_Bildeigenschaften.OrderBy(Function(o) o._FileInfo.Name, New NaturalComparer()).ToList()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/406808.html
標籤:
上一篇:Chrome的SVG問題
