Я предоставлю общее решение, и тогда вы сможете указать конкретные c подробности, потому что вы предоставили нам только один пример, который не объясняет все детали, необходимые для реального алгоритма. (РЕДАКТИРОВАТЬ: На самом деле я получил гораздо больше c, чем планировал)
Во-первых, нет ничего встроенного, что сделало бы это для вас, поэтому вы должны сами предоставить логи сравнения c. Есть несколько способов сделать это, но самый простой - использовать делегат Comparison(Of T)
, например,
Array.Sort(myArray, Function(x, y)
If x < y Then
Return -1
ElseIf x > y Then
Return 1
Else 'x = y
Return 0
End If
End Function)
. Делегат Comparison(Of T)
ссылается на функцию, которая принимает два объекта типа T
и возвращает Integer
, который представляет их относительную величину. Если первый объект считается меньше второго, то возвращаемое значение должно быть меньше нуля, а если первый объект считается больше второго, то возвращаемое значение должно быть больше нуля. Если два объекта считаются равными, вернуть ноль. Положительные и отрицательные возвращаемые значения обычно равны 1 и -1 соответственно, но это не обязательно. Это означает, что, например, они могут быть результатом вычитания указанного свойства c цифра c, например
Array.Sort(myArray, Function(x, y) x.SomeIntegerProperty - y.SomeIntegerProperty)
На основании вашего примера похоже, что вы можете взять символы после первых восьми, а затем сортируйте сначала по последней букве и, если она совпадает, сортируйте по предыдущему значению di git там, где оно есть. Это может выглядеть так:
Array.Sort(myArray, Function(x, y)
'Get the last letter.
Dim xLetter = x.Last()
Dim yLetter = y.Last()
'Sort by letter if they are different.
If xLetter < yLetter Then
Return -1
ElseIf xLetter > yLetter Then
Return 1
End If
'Get the characters after the common prefix.
Dim xSuffix = x.Substring(8)
Dim ySuffix = y.Substring(8)
'Get a number from the suffix, zero if no digit present.
Dim xNumber = Val(xSuffix)
Dim yNumber = Val(ySuffix)
'Sort by number.
Return Math.Sign(xNumber - yNumber)
End Function)
Обратите внимание, что здесь я использовал лямбда-выражение, но вы также можете использовать обычный метод. Метод будет написан так:
Private Function CompareStrings(x As String, y As String) As Integer
'Get the last letter.
Dim xLetter = x.Last()
Dim yLetter = y.Last()
'Sort by letter if they are different.
If xLetter < yLetter Then
Return -1
ElseIf xLetter > yLetter Then
Return 1
End If
'Get the characters after the common prefix.
Dim xSuffix = x.Substring(8)
Dim ySuffix = y.Substring(8)
'Get a number from the suffix, zero if no digit present.
Dim xNumber = Val(xSuffix)
Dim yNumber = Val(ySuffix)
'Sort by number.
Return Math.Sign(xNumber - yNumber)
End Function
, а затем будет использоваться так:
Array.Sort(myArray, AddressOf CompareStrings)