IComparer не вернул ноль, когда Array.Sort вызвал x.CompareTo (x) - PullRequest
1 голос
/ 04 апреля 2011

Я реализовал IComparer для сортировки результатов на странице поиска. Иногда на производстве пользователи получают эту ошибку. Все данные для поиска (критерии, разбиение по страницам, сортировка) находятся в строке запроса, и я использую библиотеку ELMAH, поэтому я могу видеть подробности в сообщении электронной почты об ошибке. Если я скопирую строку запроса от пользователя, который получил ошибку, в мой браузер, страница будет работать нормально. Так что это своего рода недетерминированный, по-видимому.

Это мой компаратор:

Public Class ReverseDateComparer
    Implements IComparer(Of Promotion)

    Public Function Compare(ByVal x As Promotion, ByVal y As Promotion) As Integer Implements System.Collections.Generic.IComparer(Of Promotion).Compare
        If y.ExpirationDate = x.ExpirationDate Then
            Return x.PlainTitle.CompareTo(y.PlainTitle)
        Else
            Return y.ExpirationDate.CompareTo(x.ExpirationDate)
        End If
    End Function
End Class

Так что, в основном, сортировка по дате истечения по убыванию, а затем по заголовку по возрастанию. Что-то явно не так с этим?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Не слишком уверен насчет y.ExpirationDate = x.ExpirationDate. Попробуйте

Public Class ReverseDateComparer
    Implements IComparer(Of Promotion)

    Public Function Compare(x As Promotion, y As Promotion) As Integer
        Dim c As Integer = x.ExpirationDate.CompareTo(y.ExpirationDate)
        If c = 0 Then
            Return x.PlainTitle.CompareTo(y.PlainTitle)
        Else
            Return c
        End If
    End Function
End Class
0 голосов
/ 04 апреля 2011

Вы можете просто возвратить 0, если x равен y.

Public Class ReverseDateComparer
Implements IComparer(Of Promotion)

Public Function Compare(ByVal x As Promotion, ByVal y As Promotion) As Integer Implements System.Collections.Generic.IComparer(Of Promotion).Compare
    If x is y Then
        Return 0
    ElseIf y.ExpirationDate = x.ExpirationDate Then
        Return x.PlainTitle.CompareTo(y.PlainTitle)
    Else
        Return y.ExpirationDate.CompareTo(x.ExpirationDate)
    End If
End Function

Конечный класс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...