如何按F#中升序对变量进行排序?

时间:2018-10-05 21:15:53

标签: f# f#-interactive

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

类似的东西:

Data |> List.sortBy(fun t -> t.Date,ascending(t.Value))

以上是一个示例,我知道如果运行将无法正常工作。

2 个答案:

答案 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(或sortBythenBy)使用多个排序键:

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

ascdesc都收到类型为'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))