在两个或多个值上排序通用列表

时间:2009-05-15 15:43:43

标签: .net vb.net generics sorting lambda

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

产品类具有属性“Popular”数字(asc),“Clicked”数字(desc),“Name”字符串(asc)。为了命名属性,我们希望列表排序。

如何用lamba语句排序?如果发现基于一个属性对列表进行排序。

5 个答案:

答案 0 :(得分:32)

编辑刚刚意识到这是一个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);

答案 1 :(得分:5)

回答关于lambda表达式的问题,这个问题过于复杂,无法放入lambda表达式,因为VB不支持多行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)

答案 2 :(得分:4)

List<Product> sortedProducts = null;
sortedProducts = products.OrderBy(p => p.Popular)
                         .ThenByDescending(p => p.Clicked)
                         .ThenBy(p => p.Name)
                         .ToList();

答案 3 :(得分:3)

对不起,你知道任何C#吗?

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

你能从中获得所需的东西吗?

答案 4 :(得分:0)

也可以使用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)