19

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 a Lamba statement? If you have found to sort the list based on one property.

Jaymin
  • 2,879
  • 3
  • 19
  • 35

5 Answers5

40

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);
JaredPar
  • 733,204
  • 149
  • 1,241
  • 1,454
6

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)
Guffa
  • 687,336
  • 108
  • 737
  • 1,005
5
List<Product> sortedProducts = null;
sortedProducts = products.OrderBy(p => p.Popular)
                         .ThenByDescending(p => p.Clicked)
                         .ThenBy(p => p.Name)
                         .ToList();
Christos
  • 53,228
  • 8
  • 76
  • 108
underscore
  • 752
  • 12
  • 9
4

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?

bruno conde
  • 47,767
  • 15
  • 98
  • 117
0

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)