Каково правильное расположение этих двух имен, если мы сортируем это - PullRequest
0 голосов
/ 24 мая 2018

У меня есть две папки с именами CLP2_v6 и CLP_DE0_v7.Когда я попытался отсортировать его с помощью Icomparer , результат был:

Использование StrCmpLogicalW (Windows):
CLP_DE0_v7
CLP2_v6

Я сейчас сбиваю с толку, потому что когда я пытался отсортировать эти слова, используя этот Сортировщик строк текста дал мне другой ответ:

Использование TextLineSorter:
CLP2_v6
CLP_DE0_v7

То, что я хочу отобразить в моей программе, выглядит следующим образом:

Предпочтение:
CLP2_v6
CLP_DE0_v7

Здесь VB.net - мой код:

Public Class StringCompare
Implements IComparer(Of String)

Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" _
(ByVal s1 As String, ByVal s2 As String) As Int32

Public Function Compare(x As String, y As String) As Integer Implements _
        System.Collections.Generic.IComparer(Of String).Compare
    Return StrCmpLogicalW(x, y)
End Function
End Class

Sub Main()
Dim UsortedArray() As String = {
        "CLP_DE0_v7",
        "CLP2_v6"
      }

    Dim rc As New StringCompare()
    Console.WriteLine(vbLf & "Windows Sorting:")
    Array.Sort(UsortedArray, rc)

    Console.WriteLine()
    For Each dinosaur As String In UsortedArray
        Console.WriteLine(dinosaur)
    Next
End Sub

Как правильно расположить эти два слова?Есть ли у сортировки много правил, которым нужно следовать?Или у сортировки много стандартов?

1 Ответ

0 голосов
/ 24 мая 2018

Существует много разных подходов к сортировке в зависимости от требуемых результатов, контекста или доступных инструментов.Так как у вас есть .NET, вы не ограничены технологией, но вашими требованиями.

Рассмотрите эти ситуации:

Культурно-специфические

'Array sorted by English culture   
{"aa", "bb", "cc", "ch", "dd", "ee", "ff", "gg", "hh", "ii"}
'Same array sorted by Czech culture   
{"aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ch", "ii"}

А слышали ли вы когда-нибудь об этом, о, о, о?:)

Куда ты их положил?До «е», после «е», после «z»?Это будет зависеть от вашей культуры и потребностей.

Специфичные для технологии

Допустим, у вас есть строка ANSI в массиве байтов.Сортировка по байтовому значению возвращает что-то другое, чем сортировка по позиции символа в алфавите.

Специфичные для пользователя потребности

Является ли "a" больше, чем "A"?Что вообще?Что в вашей конкретной необходимости?Каталог с именем «9» больше, чем каталог с именем «10»?Сортируйте его как строку, и вы получите {"10", "9"}, откройте его в проводнике и увидите {"9", "10}. Откройте его в Total Commander, и вы получите {"10 "," 9 "} снова для того же каталога.

Заключение

Вы должны определить, что вам действительно нужно в вашем конкретном случае. И найти правильный или простой способкак это сделать. В .NET ваши результаты будут зависеть от Threading.Thread.CurrentThread.CultureInfo или от вашего собственного IComparer, который вы можете предоставить методу IList.Sort или конструкторам SortedList / SortedSet.

Risks

Вы должны знать о различной сортировке при различной информации о культуре. Например, создание и заполнение SortedList (Of String, Object) в культуре "hu-HU" в некоторых случаях вызовет странные исключения после чтения элементов в "cs-CZ"."культура, поскольку элементы не будут отсортированы должным образом, а дерево двоичного поиска будет сбито с толку.

...