Let's say you have a simple domain object with two properties:
Public Class DomainObject
Public Property Name As String
Public Property StartDate as Date
End Class
Then, let's say you have a List that's been loaded up with a bunch of DomainObject's. Here's the definition:
Dim MyList As New List(Of DomainObject)
First, let's sort by just name. You first have to create a Comparer class. The Comparer class is a bit of code that tells the Sort method how to sort. (NOTE: If you're list consists of ONE simple type, like string, you don't have to provide the Sort method with a Comparer class.) Here's a Comparer class that sorts only by the name:
Private Class DomainObjectComparer
Implements IComparer(Of DomainObject)
Public Function Compare(x As DomainObject, y As DomainObject) As Integer Implements IComparer(Of DomainObject).Compare
'-1 means y is greater (i.e. y is AFTER x)
'0 means x and y are equal.
'1 means x is greater (i.e. x is AFTER y)
If x.Name > y.Name Then
Return 1
Else
Return -1
End If
End Function
End Class
This function compares two individual DomainObjects. If x's Name is greater than y's Name, then we return 1. When we return a 1, we are saying that x is greater than y. In other words, x will come AFTER y. The inverse is true when we return -1. And if we return 0, they are absolutely equal.
Now, all we have to do is instantiate our DomainObjectComparer class and feed the resulting object into the Sort method like this:
Dim MyComparer As New DomainObjectComparer MyList.Sort(MyComparer)
Now, our list is sorted by the name property.
If you want to sort first by Name and then by StartDate descending, try this:
Private Class DomainObjectComparer
Implements IComparer(Of DomainObject)
Public Function Compare(x As DomainObject, y As DomainObject) As Integer Implements IComparer(Of DomainObject).Compare
'-1 means y is greater (i.e. y is AFTER x)
'0 means x and y are equal.
'1 means x is greater (i.e. x is AFTER y)
If x.Name > y.Name Then
Return 1
ElseIf x.Name = y.Name Then
If CDate(x.StartDate) > CDate(y.StartDate) Then
Return -1 'Notice here that it's -1 because we want descending order.
Else
Return 1
End If
ElseIf x.Name < y.Name Then
Return -1
End If
End Function
End Class
No comments:
Post a Comment