несколько сортов в списке - PullRequest
4 голосов
/ 01 апреля 2011

Я использую VB.NET и .NET Framework 3.0

Я сейчас сортирую список так:

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

Однако теперь я хочу отсортировать по FName, а также после LName. Таким образом, сортируется сначала по фамилии, а затем по имени.

Возможно ли это?

Ответы [ 5 ]

1 голос
/ 01 апреля 2011

Возможно ли это?

Да, просто напишите компаратор, который реализует желаемый порядок.Так что сравните фамилию первым;если они не равны, возвращают результат CompareTo и если они не равны, возвращают сравнение между именами.

1 голос
/ 01 апреля 2011

Да, это возможно. Я думаю, что лучше всего, если вы можете изменить класс "Люди", создать собственную функцию CompareTo().

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

затем используйте его:

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

РЕДАКТИРОВАТЬ: преобразовать в VB.NET.

0 голосов
/ 20 марта 2015

Ответ Bala R по сути правильный, но мне пришлось предоставить компилятору немного больше информации, чтобы обойти ошибку компилятора, которую вы видели:

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

и

lstPeople.Sort(New PeopleComparer())
0 голосов
/ 22 января 2013

Implements System.Collections.Generic.IComparer(Of People).Compare должны быть добавлены к функции. Заглушка генерируется путем ввода клавиши ввода после 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 голосов
/ 01 апреля 2011

Попробуйте

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

и

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