如何按升序变量对列表进行排序?
类似于:
Data |> List.sortBy(fun t -> t.Date,ascending(t.Value))以上是一个例子,我知道这不会工作,如果运行。
发布于 2018-10-07 05:07:55
根据您的示例,看起来您希望使用多个排序键,其中一些应该按升序排列,而另一些则按降序排列。我认为这是一个其他任何问题都没有回答的情况。
通常,您可以通过使用元组在F#中使用多个排序键。F#有函数List.sortBy和List.sortByDescending,它们提供了两种可能的顺序:
data |> Seq.sortByDescending (fun x -> x.FirstKey, x.SecondKey)但是,这样两个键的排序顺序将是相同的。没有一种简单的方法可以在一个顺序中使用一个键,而在另一个顺序中使用另一个键。在许多情况下,您可以只使用数字减号并执行以下操作:
data |> Seq.sortByDescending (fun x -> x.FirstKey, -x.SecondKey)由于MaxInt的值,这并不完全是万无一失的,但它可能经常会起作用。在F#查询表达式(灵感来源于LINQ的工作方式)中,可以使用sortBy和thenBy (或sortByDescending和thenByDescending)使用多个排序键:
query {
for x in data do
sortByDescending x.FirstKey
thenBy x.SecondKey }在这里,第一个键将用于降序排序,当有多个项具有相同的FirstKey时,第二个键将用于该组内的升序排序。我怀疑这可能是您在一般情况下所需要的-但有点不幸的是,没有很好的方法来编写管道语法。
发布于 2018-10-08 13:33:33
使用List.sortWith和函数组合的强大功能,您可以轻松地按多个键进行排序,升序、降序或任何其他复杂的顺序:
您所需要的只是几个助手函数和一个操作符:
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 -> rasc和desc都接收类型为'T->'K的键检索函数,并调用泛型函数compare来按升序或降序排序。运算符&>允许您组合它们,以便根据需要按任意多个键进行排序。由于您还可以添加自定义比较器,因此使用此技术可以进行任何类型的排序:
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"]您的示例将如下所示:
Data |> List.sortWith( desc (fun t -> t.Date) &>
asc (fun t -> t.Value))https://stackoverflow.com/questions/52673372
复制相似问题