[英]How to customize sort order of strings
我對使用字符串數組完全不熟悉。 考慮這個例子:
我在文本框中有以下值:
bufallo@2000
lice@20
cell@1
rat@150
cow@10000
當我對它們進行排序時,它們按字母順序排序,如上面的列表中所示。 但是,我需要它們使用@符號后面的整數值按降序排序。 所以,例如,我希望上面的列表像這樣排序:
cow@10000
bufallo@2000
rat@150
lice@20
cell@1
我不知道如何按照這樣的降序排列它們。
雖然在單個LINQ表達式中完成所有邏輯可以證明你是多么聰明:)有時代碼更容易閱讀和遵循,如果你以更冗長的方式做。 因此,如果您不想使用LINQ,您可以創建自己的IComparer
類,其中包含您的自定義排序算法:
Public Class MyComparer
Implements IComparer(Of String)
Public Function Compare(ByVal x As String, ByVal y As String) As Integer Implements IComparer(Of String).Compare
Dim xParts() As String = x.Split("@"c)
Dim yParts() As String = y.Split("@"c)
'Get the integer value (after the @ symbol) of each parameter
Dim xValue As Integer = 0
Dim yValue As Integer = 0
If xParts.Length = 2 Then
Integer.TryParse(xParts(1), xValue)
End If
If yParts.Length = 2 Then
Integer.TryParse(yParts(1), yValue)
End If
'Compare y-to-x instead of x-to-y because we want descending order
Return yValue.CompareTo(xValue)
End Function
End Class
在此示例中, IComparer是標准的.NET框架接口,您將在MyComparer
類中實現該接口。 Compare方法(由IComparer
定義)只需要兩個參數並進行比較。 如果x
小於y
(即x
在排序順序中位於y
之前),則該方法將返回負數(例如-1)。 如果x
大於y
,則返回正數(例如1)。 如果x
和y
相等,則該方法將返回0。
但是,在這種情況下,由於我們要做的只是使用標准整數排序,我們可以調用Integer.CompareTo來比較兩個整數並根據需要返回負數,正數或零。
然后,當您調用Array.Sort
方法時,您可以為其提供一個自定義IComparer
對象,以便它使用您的自定義排序算法而不是默認行為:
Dim arrayToSort() As String = New String() {"bufallo@2000", "lice@20", "cell@1", "rat@150", "cow@10000"}
Array.Sort(arrayToSort, New MyComparer())
Sort方法將使用您為其提供的IComparer
對象來執行排序。 每次需要比較數組中的兩個項目以查看哪個應該首先出現時,它將調用MyComparer.Compare
並使用該方法返回的值來確定正確的排序。
您可以在代碼中的任何位置重復使用相同的MyComparer
類,使用相同的算法對項目進行排序,這是LINQ方法的另一個好處。 實現自己的IComparer
類允許您制作各種非常強大的可自定義排序順序。
您想按字符串的數字部分排序嗎? 不需要正則表達式。
您可以使用String.Split
和Enumerable.OrderByDescending
:
Dim number As Int32 = Int32.MinValue
Dim orderedLines = From line In TextBox1.Lines
Let parts = line.Split("@"c)
Let numericPart = parts.Last()
Let success = Int32.TryParse(numericPart, number)
Select LineInfo = New With {line, number}
Order By LineInfo.number Descending
Select LineInfo.line
' if you want to reassign it to the TextBox:
TextBox1.Lines = orderedLines.ToArray()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.