【问题标题】:multiple sorts on list<Of T>list<Of T> 上的多种排序
【发布时间】:2011-07-27 18:37:47
【问题描述】:

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

我目前正在对这样的列表进行排序:

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

但是,现在我想在 LName 之后按 FName 排序。所以它首先按姓氏排序,然后按名字排序。

这可能吗?

【问题讨论】:

  • 如果不能使用 Linq,则必须实现自己的 IComparer

标签: vb.net linq list generics sorting


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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())
    

    【讨论】:

      【解决方案3】:

      是的,这是可能的。 我认为最好的方法是,如果您可以更改“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
      • CompareTo 在 2 对象相同时返回 0。因此,如果最后一个 CompareTo 返回 0,请转到下一个标准.. 并继续,直到您发现一些差异..
      • VB.NET 版本的机会吗?
      • 我改用 VB.NET。顺便说一句,你可以在互联网上找到很多从 C# 到 VB 的转换器。
      【解决方案4】:

      试试

      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())
      

      【讨论】:

      • 你应该可以在 3.0 中使用 IComparer(of T)
      • 酷..谢谢。我指的是 3.0 用于您的初始帖子 :)...顺便说一句,如果我想进行多种排序,我该怎么做?即按 A 排序,然后按 B,然后按 C,然后按 D?
      • 把排序逻辑,你想要的,放在比较函数中。此函数返回整数。小于零 x 小于 y。零 x 等于 y。大于零 x 大于 y。
      • 我收到一个错误,即 PeopleComparer 必须为接口 IComparer(of People) 实现“函数比较(x As People,y As People)As Integer”?
      • 在上面的示例中,有一个具有该签名的函数。您是否使用了如上所示的 PeopleComparer?
      【解决方案5】:

      这可能吗?

      是的,只需编写一个实现您想要的排序的比较器。所以先比较姓氏;如果它们不相等,则返回 CompareTo 的结果,如果它们不相等,则返回名字之间的比较。

      【讨论】:

      • 它能在 .NET 3.0 下工作吗?我记得不久前试图实现这样的东西,但我无法这样做。使用 IComparer 对吗?
      猜你喜欢
      • 2021-05-25
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多