Ответ 1
Используйте кортеж в качестве ключа сортировки:
myList |> Seq.sortBy (fun x -> x.Something, x.SomethingElse)
Есть ли какая-либо функция в 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)
спасибо
Используйте кортеж в качестве ключа сортировки:
myList |> Seq.sortBy (fun x -> x.Something, x.SomethingElse)
Вы можете найти некоторые из алгоритмов сортировки здесь полезными, так как я не знаю, как ждать в F #, чтобы выполнять сортировку, помимо использования .NET-функций.
Поскольку sortBy
определен как стабильный, вы можете сортировать несколько раз, используя вторичный ключ (ключи) в обратном порядке:
myList |> Seq.sortBy (fun x -> x.SomethingElse) |> Seq.SortBy (fun x -> x.Something)
Элементы, которые сравниваются одинаково для первичного ключа, сохранят предыдущее упорядочение, выполненное вторичным ключом. Элементы, которые сравниваются одинаково для обоих ключей, будут в исходном порядке. Это имеет преимущество (в отличие от метода кортежа), заключающееся в том, что вы можете контролировать, будет ли сортировка по убыванию для каждого из ключей независимо.
Если ваши ключи сортировки являются целыми числами со знаком, и вы хотите отсортировать, скажем, вторичный ключ в порядке убывания, вы все равно можете использовать метод кортежа, используя отрицание:
myList |> Seq.sortBy (fun x -> x.Something, -x.SomethingElse)
Этот метод, возможно, менее понятен, но может быть быстрее, чем сортировка в два раза. Имейте в виду, что он неправильно обрабатывает наименьшее значение из-за переполнения.