订单然后在F#中

时间:2009-05-05 18:38:11

标签: .net linq sorting 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)

THX

2 个答案:

答案 0 :(得分:48)

使用元组作为排序键:

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

答案 1 :(得分:0)

由于sortBydefined to be stable,因此您可以使用次要键以相反的顺序进行多次排序:

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

与主键比较相同的项目将保留由辅键完成的先前顺序。与两个键相同的项目将保持原始顺序。与tuple方法不同,它的优点是可以独立控制每个键的排序方式。

如果您的排序键是带符号的整数,并且您希望以降序对第二个键进行排序,那么您仍然可以使用带负号的元组方法:

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

可以说这种方法不太清楚,但可能比两次排序更快。请注意,由于溢出,它不能正确处理最小值。