簡體   English   中英

如何自定義字符串的排序順序

[英]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)。 如果xy相等,則該方法將返回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.SplitEnumerable.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM