订单然后在F#中

Luc*_*tti 30 .net linq sorting f#

F#中的任何函数是否类似于LINQ流畅语法,可以按多个表达式进行排序:

myList.OrderBy(fun x->x.Something).ThenBy(fun x->x.SomethingElse)
Run Code Online (Sandbox Code Playgroud)

我喜欢这样的东西:

myList 
|> Seq.sort_by(fun x->x.Something) 
|> Seq.then_by(fun x->x.SomethingElse)
Run Code Online (Sandbox Code Playgroud)

谢谢

Tim*_*son 52

使用元组作为排序键:

myList |> Seq.sortBy (fun x -> x.Something, x.SomethingElse)
Run Code Online (Sandbox Code Playgroud)

  • 是的,元组按字典顺序排序,因此在元组中从左到右依次放置多个键就可以实现所需. (4认同)
  • 这正是我所期望的 F# 标准库提供的优雅解决方案 (3认同)

Ric*_*key 7

因为sortBy定义为 stable,您可以多次排序,以相反的顺序使用辅助键:

myList |> Seq.sortBy (fun x -> x.SomethingElse) |> Seq.SortBy (fun x -> x.Something)
Run Code Online (Sandbox Code Playgroud)

主键比较相同的项目将保留由辅助键完成的先前排序。比较两个键相同的项目将按原始顺序排列。这有一个优点(与元组方法不同),您可以独立控制每个键的排序是否按降序排列。

如果您的排序键是有符号整数并且您希望按降序对辅助键进行排序,您仍然可以使用使用否定的元组方法:

myList |> Seq.sortBy (fun x -> x.Something, -x.SomethingElse)
Run Code Online (Sandbox Code Playgroud)

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