在List<T>中进行多个排序

4

我正在使用VB.NET和.NET框架3.0

我目前正在对一个列表进行排序:

  lstPeople.Sort(Function(p1, p2) p1.LName.CompareTo(p2.LName))

然而,现在我想在按照LName排序后也按照FName进行排序。所以它首先按照姓氏排序,然后按照名字排序。

这种排序方式是否可行?


如果您无法使用Linq,则必须实现自己的IComparer - Magnus
5个回答

1

是的,这是可能的。 我认为最好的方法是,如果你可以改变“People”类,创建自己的CompareTo()函数。

Private Function CompareTo(p2 As People) As Integer
    Dim i As Int32 = Me.LName.CompareTo(p2.LName)
    If i = 0 Then
        Return Me.FName.CompareTo(p2.FName)
    End If
    Return i
End Function

然后使用它:

  lstPeople.Sort(Function(p1, p2) p1.CompareTo(p2))   

编辑:转换为VB.NET。


谢谢,如果我想进行更多的排序,比如先按A排序,然后按B排序,再按C排序,最后按D排序呢? - waqasahmed
当两个对象相同时,CompareTo返回0。因此,如果最后一个CompareTo返回0,请转到下一个标准..并继续直到找到一些差异.. - Kipotlov
有没有VB.NET版本的可能性? - waqasahmed
我改用了VB.NET。顺便说一下,你可以在互联网上找到许多将C#转换为VB的转换器。 - Kipotlov

1
这个可能吗?
是的,只需编写一个实现您想要的排序的比较器。因此,首先比较姓氏;如果它们不相等,则返回CompareTo的结果,如果它们仍然不相等,则返回名字之间的比较。

它能在.NET 3.0下工作吗?我记得以前尝试过实现类似的东西,但是无法做到。使用IComparer对吧? - waqasahmed

0
Bala R的回答基本上是正确的,但我必须向编译器提供更多信息才能解决你遇到的编译器错误:
Public Class PeopleComparer
    Implements IComparer(Of People)

    Public Function Compare(x As People, y As People) As Integer Implements IComparer(Of People).Compare
         Dim lnameComparison As Integer = x.LName.CompareTo(y.LName)
         Return If(lnameComparison = 0, x.FName.CompareTo(y.FName), lnameComparison)
    End Function
End Class

lstPeople.Sort(New PeopleComparer())

0

尝试

Public Class PeopleComparer
    Implements IComparer(Of People)

    Public Function Compare(x As People, y As People) As Integer
         Dim lnameComparison As Integer = x.LName.CompareTo(y.LName)
         Return If(lnameComparison = 0, x.FName.CompareTo(y.FName), lnameComparison)
    End Function
End Class

lstPeople.Sort(New PeopleComparer())

我遇到了一个错误,提示PeopleComparer必须实现接口IComparer(of People)的“Function Compare(x As People, y As People) As Integer”。 - waqasahmed
在上面的例子中,有一个带有该签名的函数。你是否像上面展示的那样使用了PeopleComparer? - Bala R
我使用了以下代码: Public Class ItemComparer Implements IComparer(Of SB)Public Function Compare(ByVal x As SB, ByVal y As SB) As Integer Dim iComparison As Integer = x.Item.CompareTo(y.Item) Return If(iComparison = 0, x.We.CompareTo(y.We), iComparison) End FunctionEnd Class - waqasahmed
在您的ItemComparer中,x.Item和x.We应该是字符串或基本值类型,例如int、long、double等。如果不是,则应该是实现了IComparer接口的类型。 - Bala R
请参见下面对此答案的微调。(无法在评论中放置代码。) - David Rogers
显示剩余4条评论

0

必须添加Implements System.Collections.Generic.IComparer(Of People).Compare函数中。通过在IComparer(Of People)后键入回车键生成桩。

Public Class PeopleComparer
    Implements IComparer(Of People)

    Public Function Compare(x As People, y As People) As Integer Implements System.Collections.Generic.IComparer(Of People).Compare
        Dim lnameComparison As Integer = x.LName.CompareTo(y.LName)
        Return If(lnameComparison = 0, x.FName.CompareTo(y.FName), lnameComparison)
    End Function
End Class

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接