Подтвердить что ты не робот

OrderBy ThenBy в F #

Есть ли какая-либо функция в 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)

спасибо

4b9b3361

Ответ 1

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

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

Ответ 2

Вы можете найти некоторые из алгоритмов сортировки здесь полезными, так как я не знаю, как ждать в F #, чтобы выполнять сортировку, помимо использования .NET-функций.

http://cs.hubfs.net/forums/thread/3876.aspx

Ответ 3

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

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

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

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

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

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