Использование CompareTo () для сортировки по нескольким столбцам - PullRequest
2 голосов
/ 23 июня 2009

В настоящее время у меня есть объект, реализующий интерфейс IComparable (ASP.NET 3.5, VB). Когда я помещаю несколько экземпляров объектов в список Generics, я сортирую их, выполняя простой someList.Sort. Моя CompareTo() функция такова:

Public Function CompareTo(ByVal obj As Object) As Integer Implements 
System.IComparable.CompareTo
    'default is number of votes (opposite direction, highest first)'
    Dim sent As Sentence = CType(obj, Sentence)
    Return Not Points.CompareTo(sent.Points)
End Function

Это работает нормально, за исключением того, что теперь мне нужно отсортировать по другому свойству, свойству DateSubmitted, как подмножеству точек. Например, если три предложения имеют голоса: 3, 1, 1, я хочу, чтобы одно (с наибольшим количеством голосов) было первым (очевидно), а из двух предложений с одним голосом - одно, которое отправило самое раннее в список.

Возможно ли это с CompareTo (), или мне нужно просто снова щелкнуть базу данных и отсортировать ее там?

Спасибо

Ответы [ 2 ]

6 голосов
/ 23 июня 2009

Ваша функция CompareTo () неверна. Вам необходимо вернуть правильные результаты для трех состояний (<, = и>), и ваш Not означает, что функция правильно обрабатывает только два из них. Это вызовет проблемы, если вы вызовете функцию из достаточно большого списка.

Как уже упоминал MehrdadA, в .Net 3.5 есть более простой способ справиться с этим. Но вот как это сделать, если по какой-то причине вы не можете обработать лямбда-выражения:

Public Function CompareTo(Of Sentence)(ByVal obj As Sentence) As Integer _
  Implements System.IComparable.CompareTo(Of Sentence)

    If obj Is Nothing Return 1
    Dim result As Integer = Points.CompareTo(obj.Points) * -1
    If result = 0 Then result = DateSubmitted.CompareTo(obj.DateSubmitted)
    Return result
End Function

Обратите внимание, что теперь вы хотите реализовать IComparable(Of T), а не IComparable.

2 голосов
/ 23 июня 2009

Поскольку вы работаете в .NET 3.5, вы можете легко сортировать, используя метод расширения OrderBy:

Dim someSortedList = someList.OrderBy(Function(item) item.SomeColumn) _
                             .ThenBy(Function(item) item.SomeOtherColumn)
                             .ToList()

' OrderByDescending and ThenByDescending are also there for descending order

Нужно ли вам снова обращаться к базе данных или нет, зависит от того, как вы сначала извлекли данные. Если у вас большой набор данных и вы получили только небольшое его подмножество из БД, то нет, вам нужно просто попросить БД получить небольшое подмножество данных на основе нового порядка сортировки. В противном случае, если у вас уже есть все это в памяти, просто рассортируйте его, как я упоминал выше.

...