2009-06-22 5 views
2

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

Поскольку вы на .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 

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

+0

Я не могу получить someList.OrderBy, чтобы всплывать в intellisense ... Я уверен, что я использую 3.5 (я использую VS08), но я предполагаю, что это возможно, я не? – Jason

+1

У вас есть 'Imports System.Linq'? Убедитесь, что в вашем Web.config есть «». –

+0

ах! нормально ... я импортировал Linq ... что представляет собой элемент? является ли экземпляр объекта? – Jason

6

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

Как уже упоминалось MehrrdA, .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.

+0

+1, спасибо ... я пошел с linq-решением, но это помогло мне понять CompareTo() – Jason

+0

+1 для сравнения '+ -1' с отменой сравнения. – Shimmy