0

I want to sort all items in the list of the property reviews of the class CompanyTotalReview by the property reviewdatetime in descending order.

Here's what I have:

Dim allReviews As RestService.CompanyTotalReview = rst.getReviews(type, objectId, _lang)

Dim dc As New ReviewComparer
allReviews.reviews.Sort(dc)



Public Class CompanyTotalReview
    Public Property totalreviews() As Integer
        Get
            Return _totalreviews
        End Get
        Set(value As Integer)
            _totalreviews = value
        End Set
    End Property
    Private _totalreviews As Integer

    Public Property averagereview() As String
        Get
            Return _averagereview
        End Get
        Set(value As String)
            _averagereview = value
        End Set
    End Property
    Private _averagereview As String


    Public Property reviews() As List(Of Review)
        Get
            Return m_reviews
        End Get
        Set(value As List(Of Review))
            m_reviews = value
        End Set
    End Property
    Private m_reviews As List(Of Review)

End Class


Public Class Review
    Public Property overallscore() As Integer
        Get
            Return _overallscore
        End Get
        Set(value As Integer)
            _overallscore = value
        End Set
    End Property
    Private _overallscore As Integer

    Public Property reviewtext() As String
        Get
            Return _reviewtext
        End Get
        Set(value As String)
            _reviewtext = value
        End Set
    End Property
    Private _reviewtext As String

    Public Property reviewdatetime() As DateTime
        Get
            Return _reviewdatetime
        End Get
        Set(value As DateTime)
            _reviewdatetime = value
        End Set
    End Property
    Private _reviewdatetime As DateTime


End Class

updated class based on comments

Public Class ReviewComparer
    Implements IComparer(Of RestService.Review)

    Public Function Compare(xr As RestService.Review, yr As RestService.Review) As Integer Implements System.Collections.Generic.IComparer(Of RestService.Review).Compare

        Dim x As DateTime = xr.reviewdatetime
        Dim y As DateTime = yr.reviewdatetime

        If x = Nothing Then
            If y = Nothing Then
                Return 0
            Else
                Return -1
            End If
        Else
            If y = Nothing Then
                Return 1
            Else
                Dim retval As Integer = x.CompareTo(y)

                If retval <> 0 Then
                    Return retval
                Else
                    Return x.CompareTo(y)
                End If
            End If
        End If

    End Function
End Class
Adam
  • 6,041
  • 36
  • 120
  • 208
  • your comparer needs to take the type you are comparing, not the type of the property you want to compare. E.g., `Of RestService.Review`, then in your compare method you can compare the x and y reviews' date properties with each other. – ps2goat Nov 26 '13 at 21:00

1 Answers1

1

You are sorting Review objects, not datetime objects. Use a review comparer like this.

Public Class ReviewComparer
    Implements IComparer(Of Review)

    Public Function Compare(xr As Review, yr As Review) As Integer Implements System.Collections.Generic.IComparer(Of Review).Compare

        Dim x As DateTime = xr.reviewdatetime
        Dim y As DateTime = yr.reviewdatetime

        If x = Nothing Then
            If y = Nothing Then
                Return 0
            Else
                Return -1
            End If
        Else
            If y = Nothing Then
                Return 1
            Else
                Dim retval As Integer = x.CompareTo(y)

                If retval <> 0 Then
                    Return retval
                Else
                    Return x.CompareTo(y)
                End If
            End If
        End If

    End Function
End Class
Ceres
  • 3,524
  • 3
  • 18
  • 25
  • I updated my question with your code. However, I would expect that after this line: `allReviews.reviews.Sort(dc)`, all reviews would be sorted so that when I access this review `allReviews.reviews(0).reviewtext` I would get the latest review first. Or am I sorting ascending right now? If so, how do I sort descending? Thanks! – Adam Nov 26 '13 at 21:15
  • I didn't check your logic but maybe try just a simple Return x.CompareTo(y) in your function. – Ceres Nov 26 '13 at 21:30