我如何按变量对列表进行排序但升序?
类似的东西:
Data |> List.sortBy(fun t -> t.Date,ascending(t.Value))
以上是一个示例,我知道如果运行将无法正常工作。
答案 0 :(得分:5)
根据您的示例,您似乎要使用多个排序键,其中一些排序应为升序,而其他排序应为降序。我认为这是其他任何问题都没有解决的方案。
通常,您可以通过使用元组在F#中使用多个排序键。 F#具有函数import Validators from 'redux-form-validators'
Object.assign(Validators.messages, {
required: "This is a required field"
})
// or
Object.assign(Validators.messages, {
required: {
defaultMessage: "This is a required field"
}
})
和<Field
label="Longitude"
name="location.coordinates[0]"
component={renderTextField}
type="text"
validate={[required({msg: "This is a required field"})]}
/>
,可为您提供两个可能的顺序:
List.sortBy
但是,这样两个键的排序顺序将是相同的。没有一种简单的方法可以按一个顺序使用一个键,而按另一顺序使用另一个键。在许多情况下,您可以使用数字减号并执行类似的操作:
List.sortByDescending
由于data |> Seq.sortByDescending (fun x -> x.FirstKey, x.SecondKey)
的值,这并不是完全防弹的,但它通常可能会起作用。在F#查询表达式(受LINQ的工作方式启发)中,可以使用data |> Seq.sortByDescending (fun x -> x.FirstKey, -x.SecondKey)
和MaxInt
(或sortBy
和thenBy
)使用多个排序键:
sortByDescending
这里,第一个键将用于降序排序,并且当多个项目具有相同的thenByDescending
时,第二个键将用于该组中的升序排序。我怀疑这可能是您通常需要的-但是很遗憾,没有使用管道语法编写此代码的好方法。
答案 1 :(得分:1)
使用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))