2009-05-15 15 views
14

Mamy ogólną listę (produktu), która musi być posortowana na dwóch lub więcej właściwościach klasy produktu.Sortuj listę ogólną na dwóch lub więcej wartościach

Klasa produktu ma właściwości "Popularny" numeryczny (asc), "Kliknięty" numeryczny (opis), "Nazwa" ciąg (asc). Aby nazwać właściwości, chcemy posortować listę.

Jak można sortować za pomocą instrukcji lamba? Jeśli znalazłeś, aby posortować listę na podstawie jednej właściwości.

Odpowiedz

3

Przykro mi, ale czy znasz jakieś C#?

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

Czy możesz uzyskać to, czego potrzebujesz?

+0

genialny! Nie wiedziałem o "ThenBy" – BrokeMyLegBiking

30

EDIT Właśnie zdałem sobie sprawę, że to było pytanie VB. Oto wersja VB.Net:

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

C# wersja. Spróbuj wykonać następujące czynności

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

Aby odpowiedzieć na pytanie o wyrażeniu lambda, która jest zbyt złożona, aby umieścić w wyrażeniu lambda, jak VB nie obsługuje wyrażeń lambda kilka linii.

rozwiązania non-LINQ:

Musisz nazwie metody jako 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 

Zastosowanie:

theList.Sort(AddressOf Comparer) 
+0

Rozwiązałem problem, który miałem. Dzięki! – John

+0

@Guffa - VB obsługuje wielowierszowe wyrażenia lambda. –

+0

@roryap: Tak, teraz. Nie wtedy, gdy odpowiedź została napisana. – Guffa

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