Разница между типом String.Sort и оператором «больше / меньше, чем VB.Net» - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть простая процедура, чтобы найти следующий объект на основе свойства имени в неупорядоченной коллекции объектов.Я просматриваю коллекцию и собираю все имена в List(of String), добавляя любые имена, > моего текущего имени, которые должны дать список всего, что следует за текущим ключом.Затем я сортирую список, используя метод .Sort() по умолчанию для List(of String), и беру первый элемент в списке, который должен быть моим следующим элементом.Я делаю наоборот, чтобы найти предыдущий элемент, добавляю все элементы < мое текущее имя, сортирую и беру последний элемент в списке.

Однако этот метод пропускает некоторые элементы.Например, у меня есть предметы с именами 1210, 1210-ADA и 1210_ADA_DB.Используя этот метод, получение следующего элемента пропускает средний элемент 1210-ADA и находит 1210_ADA_DB, но поиск предыдущего элемента, кажется, работает.

Если мой процесс правильный, мое единственное объяснение состоит в том, что операторы < и > сравниваются иначе, чем метод .Sort().Это правда?В чем различия?

Код для поиска следующего предмета:

        Dim Key As String = Name
        Dim NameList As New List(Of String)
        For Each obj As T In Collection
            Dim ObjKey As String = Obj.Key
            If  ObjKey > Key Then
                NameList.Add(ObjKey)
            End If
        Next
        If NameList.Count = 0 Then Return Nothing
        NameList.Sort()
        Dim NextKey As String = NameList.First

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

Я думаю, вы уже нашли, в чем может быть проблема.Но для аннотации вас укусило поведение компата VB6.Значением по умолчанию для Option Compare является Binary, в котором используется String.CompareOrdinal ().Не то, что List.Sort () использует.Опция Compare Text использует CultureInfo.CompareInfo.Compare () с параметрами CompareOptions.IgnoreWidth, CompareOptions.IgnoreKanaType, CompareOptions.IgnoreCase.Также не то, что использует List.Sort ().

Избегайте операторов и используйте вместо этого String.Compare ().

1 голос
/ 28 сентября 2011

Мое единственное объяснение состоит в том, что операторы <и> сравниваются иначе, чем метод .Sort ().Это правда?

Нет.Sort внутренне использует метод String.IComparable(Of String).CompareTo, который дает результаты, соответствующие < и >.

Однако это верно только до тех пор, пока вы не изменили Option Compare для проекта или текущего файла.Это изменит поведение < и >, но не вышеупомянутого метода.

...