IComparer не возвращал ноль, когда Array.Sort вызывал x.CompareTo(x)

Я реализовал 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

Итак, в основном, сортируйте по дате истечения срока действия по убыванию, а затем по возрастанию названия. Есть ли в этом что-то явно не так?


person joelt    schedule 04.04.2011    source источник


Ответы (2)


Не слишком уверен насчет 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
person Bala R    schedule 04.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

Конец класса

person DavRob60    schedule 04.04.2011