OrderBy ThenBy в F # - PullRequest
       13

OrderBy ThenBy в F #

26 голосов
/ 05 мая 2009

Есть ли какая-либо функция в F #, похожая на свободный синтаксис LINQ для сортировки по нескольким выражениям:

myList.OrderBy(fun x->x.Something).ThenBy(fun x->x.SomethingElse)

Я бы хотел что-то вроде:

myList 
|> Seq.sort_by(fun x->x.Something) 
|> Seq.then_by(fun x->x.SomethingElse)

Thx

Ответы [ 2 ]

49 голосов
/ 05 мая 2009

Используйте кортеж в качестве ключа сортировки:

myList |> Seq.sortBy (fun x -> x.Something, x.SomethingElse)
0 голосов
/ 08 мая 2019

Поскольку sortBy является , определенным как стабильный , вы можете сортировать несколько раз, используя вторичный ключ (ключи) в обратном порядке:

myList |> Seq.sortBy (fun x -> x.SomethingElse) |> Seq.SortBy (fun x -> x.Something)

Элементы, которые сравнивают то же самое для первичного ключа, сохранят предыдущее упорядочение, выполненное вторичным ключом. Элементы, которые сравниваются одинаково для обеих клавиш, будут в исходном порядке. Это имеет преимущество (в отличие от метода кортежей), заключающееся в том, что вы можете контролировать, будет ли сортировка по убыванию для каждого из ключей независимо.

Если ваши ключи сортировки имеют целые числа со знаком, и вы хотите отсортировать, скажем, вторичный ключ в порядке убывания, вы все равно можете использовать метод кортежа, используя отрицание:

myList |> Seq.sortBy (fun x -> x.Something, -x.SomethingElse)

Этот метод, возможно, менее понятен, но может быть быстрее, чем сортировка в два раза. Помните, что из-за переполнения оно неправильно обрабатывает наименьшее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...