开发者

multiple sorts on list<Of T>

开发者 https://www.devze.com 2023-02-21 17:14 出处:网络
I开发者_如何学Python am using VB.NET and .NET framework 3.0 I am currently sorting a list like this:

I开发者_如何学Python am using VB.NET and .NET framework 3.0

I am currently sorting a list like this:

  lstPeople.Sort(Function(p1, p2) p1.LName.CompareTo(p2.LName))

However, now I want to sort by FName as well after the LName. So it sorts first by last name and then by first name.

Is this possible?


Is this possible?

Yes, just write a comparer that implements the ordering that you want. So compare the last name first; if they are not equal return the result of CompareTo and if they are not equal return the comparison between the first names.


Yeah it's possible. I think the best way, if you can change the "People" class, create you own CompareTo() function.

Private Function CompareTo(p2 As People) As Integer
    Dim i As Int32 = Me.LName.CompareTo(p2.LName)
    If i = 0 Then
        Return Me.FName.CompareTo(p2.FName)
    End If
    Return i
End Function

then use it :

  lstPeople.Sort(Function(p1, p2) p1.CompareTo(p2))   

EDIT : Convert to VB.NET.


Try

Public Class PeopleComparer
    Implements IComparer(Of People)

    Public Function Compare(x As People, y As People) As Integer
         Dim lnameComparison As Integer = x.LName.CompareTo(y.LName)
         Return If(lnameComparison = 0, x.FName.CompareTo(y.FName), lnameComparison)
    End Function
End Class

and

lstPeople.Sort(New PeopleComparer())


Bala R's answer is essentially correct, but I had to provide the compiler with a little more information to get past the compiler error you were seeing:

Public Class PeopleComparer
    Implements IComparer(Of People)

    Public Function Compare(x As People, y As People) As Integer Implements IComparer(Of People).Compare
         Dim lnameComparison As Integer = x.LName.CompareTo(y.LName)
         Return If(lnameComparison = 0, x.FName.CompareTo(y.FName), lnameComparison)
    End Function
End Class

and

lstPeople.Sort(New PeopleComparer())


Implements System.Collections.Generic.IComparer(Of People).Compare have to be added to the function. Stub is generated by typing enter key after IComparer(Of People)

Public Class PeopleComparer
    Implements IComparer(Of People)

    Public Function Compare(x As People, y As People) As Integer Implements System.Collections.Generic.IComparer(Of People).Compare
        Dim lnameComparison As Integer = x.LName.CompareTo(y.LName)
        Return If(lnameComparison = 0, x.FName.CompareTo(y.FName), lnameComparison)
    End Function
End Class
0

精彩评论

暂无评论...
验证码 换一张
取 消