Sort Generic list on two or more values

2019-02-06 02:00发布

We have a generic List(Of Product) that must be sorted on two or more properties of the Product class.

The product class has the properties "Popular" numeric (asc), "Clicked" numeric (desc), "Name" string (asc). In order of naming the properties we want the list to sort.

How can it be sort with an lamba statement? If have found to sort the list based on one property.

5条回答
Luminary・发光体
2楼-- · 2019-02-06 02:43
List<Product> sortedProducts = null;
sortedProducts = products.OrderBy(p => p.Popular)
                         .ThenByDescending(p => p.Clicked)
                         .ThenBy(p => p.Name)
                         .ToList();
查看更多
乱世女痞
3楼-- · 2019-02-06 02:44

EDIT Just realized this was a VB question. Here is the VB.Net solution

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

C# version. Try the following

var list = GetSomeList();
var sorted = list.OrderBy(x => x.Popular).ThenBy(x => x.Clicked).ThenBy(x => x.Name);
查看更多
forever°为你锁心
4楼-- · 2019-02-06 02:45

I'm sorry but do you know any C#?

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

Can you get what you need from this?

查看更多
【Aperson】
5楼-- · 2019-02-06 02:48

To answer your question about a lambda expression, that is too complex to put in a lambda expression, as VB doesn't support multi-line lambda expressions.

For a non-LINQ solution:

You need a named method as a comparer:

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

Usage:

theList.Sort(AddressOf Comparer)
查看更多
三岁会撩人
6楼-- · 2019-02-06 02:55

A compound sort can also be done with the List.Sort lambda function. Here is a vb.Net example:

    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)
查看更多
登录 后发表回答