如何通过在F#中升序的变量进行排序?

如何通过在F#中升序的变量进行排序?,f#,f#-interactive,F#,F# Interactive,如何按变量对列表进行升序排序 比如: Data |> List.sortBy(fun t -> t.Date,ascending(t.Value)) data |> Seq.sortByDescending (fun x -> x.FirstKey, -x.SecondKey) 上面是一个例子,我知道如果运行,这将不起作用 根据您的示例,您似乎希望使用多个排序键,其中一些键应按升序排列,而另一些键应按降序排列。我认为这是一个没有任何其他问题回答的情况 通常,通过使用元

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

比如:

Data |> List.sortBy(fun t -> t.Date,ascending(t.Value))
data |> Seq.sortByDescending (fun x -> x.FirstKey, -x.SecondKey)

上面是一个例子,我知道如果运行,这将不起作用

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

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

data |> Seq.sortByDescending (fun x -> x.FirstKey, x.SecondKey)
但是,这样两个键的排序顺序将相同。在一个顺序中使用一把钥匙,在另一个顺序中使用另一把钥匙,这是不容易的。在许多情况下,您可以使用数字负号并执行以下操作:

Data |> List.sortBy(fun t -> t.Date,ascending(t.Value))
data |> Seq.sortByDescending (fun x -> x.FirstKey, -x.SecondKey)
由于
MaxInt
值的原因,这并非完全是防弹的,但它可能会经常工作。在F#查询表达式(受LINQ工作原理启发)中,您可以使用多个排序键,使用
sortBy
thenBy
(或
sortByDescending
thenbysending
):


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

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

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

data |> Seq.sortByDescending (fun x -> x.FirstKey, x.SecondKey)
但是,这样两个键的排序顺序将相同。在一个顺序中使用一把钥匙,在另一个顺序中使用另一把钥匙,这是不容易的。在许多情况下,您可以使用数字负号并执行以下操作:

Data |> List.sortBy(fun t -> t.Date,ascending(t.Value))
data |> Seq.sortByDescending (fun x -> x.FirstKey, -x.SecondKey)
由于
MaxInt
值的原因,这并非完全是防弹的,但它可能会经常工作。在F#查询表达式(受LINQ工作原理启发)中,您可以使用多个排序键,使用
sortBy
thenBy
(或
sortByDescending
thenbysending
):


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

使用
列表,您可以轻松地按多个键、升序、降序或任何其他复杂顺序进行排序。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 -> r
asc
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))

使用
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 -> r
asc
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))

可能的无因复制是升序的。@SantiClaus-链接的复制也显示了如何按升序排序。但是,如果您无法理解它:升序是默认值,所以您只需要
Data |>List.sortBy(fun t->t.Date,t.Value)
可能的无因复制是升序的。@SantiClaus-链接的复制也显示了如何按升序排序。但如果您无法确定:升序是默认值,所以您只需要
数据|>List.sortBy(fun t->t.Date,t.Value)
实际上有一种方法,“有点遗憾,没有好的方法”,这在我的回答中,“这有点不幸,没有好的方法”实际上有一种方法,它在我的回答中。