Сортировка Общий список по двум или более значениям
У нас есть общий список (Of Product), который должен быть отсортирован по двум или более свойствам класса Product.
Класс продукта имеет свойства "Популярные" числовые (asc), "Нажатые" числовые (desc), "Имя" строка (asc). В порядке именования свойств мы хотим, чтобы список сортировался.
Как это можно отсортировать с помощью оператора Lamba? Если вы нашли, чтобы отсортировать список на основе одного свойства.
Ответы
Ответ 1
EDIT Просто понял, что это вопрос VB. Вот решение VB.Net
Dim list = GetSomeList()
Dim sorted = list. _
OrderBy(Function(x) x.Popular). _
ThenBy(Function(x) x.Clicked). _
ThenBy(Function(x) x.Name)
Версия на С#. Попробуйте следующее
var list = GetSomeList();
var sorted = list.OrderBy(x => x.Popular).ThenBy(x => x.Clicked).ThenBy(x => x.Name);
Ответ 2
Чтобы ответить на ваш вопрос о лямбда-выражении, это слишком сложно, чтобы включить выражение лямбда, поскольку VB не поддерживает многострочные лямбда-выражения.
Для решения, отличного от 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)
Ответ 3
List<Product> sortedProducts = null;
sortedProducts = products.OrderBy(p => p.Popular)
.ThenByDescending(p => p.Clicked)
.ThenBy(p => p.Name)
.ToList();
Ответ 4
Извините, но знаете ли вы С#?
products.OrderBy(p => p.Popular).
ThenByDescending(p => p.Clicked).
ThenBy(p => p.Name);
Вы можете получить то, что вам нужно от этого?
Ответ 5
Составную сортировку также можно выполнить с помощью лямбда-функции List.Sort. Вот пример 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)