首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在F#中按变量升序排序?

如何在F#中按变量升序排序?
EN

Stack Overflow用户
提问于 2018-10-06 05:15:53
回答 2查看 203关注 0票数 0

如何按升序变量对列表进行排序?

类似于:

代码语言:javascript
复制
Data |> List.sortBy(fun t -> t.Date,ascending(t.Value))

以上是一个例子,我知道这不会工作,如果运行。

EN

回答 2

Stack Overflow用户

发布于 2018-10-07 05:07:55

根据您的示例,看起来您希望使用多个排序键,其中一些应该按升序排列,而另一些则按降序排列。我认为这是一个其他任何问题都没有回答的情况。

通常,您可以通过使用元组在F#中使用多个排序键。F#有函数List.sortByList.sortByDescending,它们提供了两种可能的顺序:

代码语言:javascript
复制
data |> Seq.sortByDescending (fun x -> x.FirstKey, x.SecondKey)

但是,这样两个键的排序顺序将是相同的。没有一种简单的方法可以在一个顺序中使用一个键,而在另一个顺序中使用另一个键。在许多情况下,您可以只使用数字减号并执行以下操作:

代码语言:javascript
复制
data |> Seq.sortByDescending (fun x -> x.FirstKey, -x.SecondKey)

由于MaxInt的值,这并不完全是万无一失的,但它可能经常会起作用。在F#查询表达式(灵感来源于LINQ的工作方式)中,可以使用sortBythenBy (或sortByDescendingthenByDescending)使用多个排序键:

代码语言:javascript
复制
query {
  for x in data do
  sortByDescending x.FirstKey
  thenBy x.SecondKey }

在这里,第一个键将用于降序排序,当有多个项具有相同的FirstKey时,第二个键将用于该组内的升序排序。我怀疑这可能是您在一般情况下所需要的-但有点不幸的是,没有很好的方法来编写管道语法。

票数 5
EN

Stack Overflow用户

发布于 2018-10-08 13:33:33

使用List.sortWith和函数组合的强大功能,您可以轻松地按多个键进行排序,升序、降序或任何其他复杂的顺序:

您所需要的只是几个助手函数和一个操作符:

代码语言:javascript
复制
let asc   f    a b = compare (f a) (f b)
let desc  f    a b = compare (f b) (f a)
let (&>) c1 c2 a b = match c1 a b with 0 -> c2 a b | r -> r

ascdesc都接收类型为'T->'K的键检索函数,并调用泛型函数compare来按升序或降序排序。运算符&>允许您组合它们,以便根据需要按任意多个键进行排序。由于您还可以添加自定义比较器,因此使用此技术可以进行任何类型的排序:

代码语言:javascript
复制
let ls = [ "dd"; "a"; "b"; "c"; "aa"; "bb"; "cc"]

ls |> List.sortWith(desc Seq.length &> 
                    asc  id)        
// result = ["aa"; "bb"; "cc"; "dd"; "a"; "b"; "c"]

ls |> List.sortWith( asc Seq.length &> 
                     desc id) 
// result = ["c"; "b"; "a"; "dd"; "cc"; "bb"; "aa"]

您的示例将如下所示:

代码语言:javascript
复制
Data |> List.sortWith( desc (fun t -> t.Date)  &> 
                        asc (fun t -> t.Value))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52673372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档