使用CompareTo()基于多个列进行排序

时间:2009-06-22 23:17:38

标签: asp.net generics sorting icomparable

目前我有一个实现IComparable接口的对象(ASP.NET 3.5,VB)。当我将几个实例化对象放入泛型列表时,我通过做一个简单的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属性排序作为Points的子集。例如,如果三个句子有投票:3,1,1,我希望得票率最高的那个(显然)和一个投票的两个句子,那个提交最早被列出的那个。

这可以通过CompareTo()实现,还是应该再次点击数据库并在那里进行排序?

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

是否应该再次访问数据库取决于您首先检索数据的方式。如果您有一个大型数据集并且您只从数据库中检索了一小部分数据集,那么您应该只要求数据库根据新的排序顺序获取一小部分数据。否则,如果你已经把整件事记在内存中,那就按照我上面提到的那样排序。