Сортировать общий список по двум или более значениям - PullRequest
15 голосов
/ 15 мая 2009

У нас есть общий список (Of Product), который должен быть отсортирован по двум или более свойствам класса Product.

Класс продукта имеет свойства «Популярные» числовые (asc), «Нажатые» числовые (desc), «Имя» строка (asc). В порядке именования свойств мы хотим отсортировать список.

Как это можно отсортировать с помощью выражения lamba? Если нашли сортировку списка по одному свойству.

Ответы [ 5 ]

32 голосов
/ 15 мая 2009

РЕДАКТИРОВАТЬ Просто понял, что это был вопрос 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);
5 голосов
/ 15 мая 2009

Чтобы ответить на ваш вопрос о лямбда-выражении, это слишком сложно, чтобы вставить его в лямбда-выражение, поскольку 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)
4 голосов
/ 26 марта 2014
List<Product> sortedProducts = null;
sortedProducts = products.OrderBy(p => p.Popular)
                         .ThenByDescending(p => p.Clicked)
                         .ThenBy(p => p.Name)
                         .ToList();
3 голосов
/ 15 мая 2009

Извините, но знаете ли вы какой-нибудь C #?

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

Можете ли вы получить то, что вам нужно от этого?

0 голосов
/ 14 января 2019

Составную сортировку также можно выполнить с помощью лямбда-функции 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...