【问题标题】:Sort Generic list on two or more values根据两个或多个值对通用列表进行排序
【发布时间】:2010-10-26 13:09:02
【问题描述】:

我们有一个通用 List(Of Product),它必须根据 Product 类的两个或多个属性进行排序。

产品类具有“流行”数字 (asc)、“点击”数字 (desc)、“名称”字符串 (asc) 属性。为了命名属性,我们希望对列表进行排序。

如何使用 Lamba 语句进行排序?如果您发现根据一个属性对列表进行排序。

【问题讨论】:

    标签: .net vb.net generics sorting lambda


    【解决方案1】:

    编辑 刚刚意识到这是一个 VB 问题。这是VB.Net的解决方案

    Dim list = GetSomeList()
    Dim sorted = list. _
      OrderBy(Function(x) x.Popular). _
      ThenBy(Function(x) x.Clicked). _
      ThenBy(Function(x) x.Name)
    

    C# 版本。试试下面的

    var list = GetSomeList();
    var sorted = list.OrderBy(x => x.Popular).ThenBy(x => x.Clicked).ThenBy(x => x.Name);
    

    【讨论】:

      【解决方案2】:

      回答您关于 lambda 表达式的问题,因为 VB 不支持多行 lambda 表达式,所以太复杂而无法放入 lambda 表达式。

      对于非 LINQ 解决方案:

      您需要一个命名方法作为比较器:

      Private Function Comparer(ByVal x As Product, ByVal y As Product) As Integer
          Dim result As Integer = x.Popular.CompareTo(y.Popular)
          If result = 0 Then
              result = x.Clicked.CompareTo(y.Clicked)
              If result = 0 Then
                  result = x.Name.CompareTo(y.Name)
              End If
          End If
          Return result
      End Function
      

      用法:

      theList.Sort(AddressOf Comparer)
      

      【讨论】:

      • 解决了我遇到的一个问题。谢谢!
      • @Guffa -- VB 确实支持多行 lambda 表达式。
      • @roryap:是的,现在可以了。不是在写答案的时候。
      • @Guffa 在你一定不使用LINQ的时候真的很有帮助,谢谢你救了我。
      【解决方案3】:
      List<Product> sortedProducts = null;
      sortedProducts = products.OrderBy(p => p.Popular)
                               .ThenByDescending(p => p.Clicked)
                               .ThenBy(p => p.Name)
                               .ToList();
      

      【讨论】:

        【解决方案4】:

        对不起,你知道 C# 吗?

        products.OrderBy(p => p.Popular).
            ThenByDescending(p => p.Clicked).
            ThenBy(p => p.Name);
        

        你能从中得到你需要的东西吗?

        【讨论】:

        • 太棒了!我不知道“ThenBy”
        【解决方案5】:

        也可以使用 List.Sort lambda 函数完成复合排序。这是一个 vb.Net 示例:

            Dim Conts As List(of clsContact)
            Conts.Sort(Function(C1 As clsContact, C2 As clsContact)
                Dim CompRes As Integer = C1.Contact_LastName.CompareTo(C2.Contact_LastName)
                If CompRes = 0 Then
                    CompRes = C1.Contact_FirstName.CompareTo(C2.Contact_FirstName)
                End If
        
                Return CompRes
            End Function)
        

        【讨论】:

          猜你喜欢
          • 2021-07-20
          • 1970-01-01
          • 1970-01-01
          • 2019-03-04
          • 2022-01-14
          • 2015-08-29
          • 1970-01-01
          • 2015-10-17
          • 1970-01-01
          相关资源
          最近更新 更多