2

目前我有一个实现 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() 可以做到这一点,还是我应该再次点击数据库并在那里对其进行排序?

谢谢

4

2 回答 2

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.

于 2009-06-22T23:38:27.140 回答
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

您是否应该再次访问数据库取决于您首先如何检索数据。如果您有一个大型数据集并且您只从数据库中检索了其中的一小部分,那么不,您应该只要求数据库根据新的排序顺序获取一小部分数据。否则,如果您已经将整个内容都保存在内存中,只需按照我上面提到的方式对其进行排序。

于 2009-06-22T23:20:01.810 回答