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

Jas*_*son 2 asp.net sorting generics 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
Run Code Online (Sandbox Code Playgroud)

这很好,除了现在我需要按另一个属性DateSubmitted属性排序作为Points的子集.例如,如果三个句子有投票:3,1,1,我希望第一个(显然)得票最多的那个和一个投票的两个句子,那么最早提交的一个要列出.

这可能是CompareTo(),或者我应该再次点击数据库并在那里排序?

谢谢

Joe*_*orn 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
Run Code Online (Sandbox Code Playgroud)

请注意,您现在要实现IComparable(Of T),而不是IComparable.