2009-06-22 69 views
2

目前我有一個實現IComparable接口(ASP.NET 3.5,VB)的對象。當我將幾個實例化對象放入泛型列表中時,我通過簡單的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 2009-06-22 23:25:53

+1

你有`Imports System.Linq`嗎?確保Web.config中有一個「」。 – 2009-06-22 23:28:20

6

您的CompareTo()函數不正確。您需要返回三個狀態(<,=和>)的正確結果,而您的Not表示該功能只能正確處理其中兩個狀態。這個如果你在一個足夠大的列表上調用該函數會導致問題。

正如MehrdadA已經提到的,.net 3.5有一個更簡單的方法來處理它。但這裏是如何做到這一點,如果你因爲某些原因無法處理的lambda表達式:

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