对数组进行排序,以便所有带有Some的元素都在前面

时间:2016-05-09 17:40:14

标签: .net arrays sorting f# optional

我有一个F#记录类型(Request<'a>),其中一个字段定义为('a -> bool) option。在某些时候,我有一个这种记录类型的数组,并希望对它进行排序,以便所有Some ('a -> bool)的那些都是第一个(最低索引),所有那些None将是最后一个(最高指数)。

我尝试过以下操作,但这似乎不起作用,因为我有一些位于数组的中间/末尾:

let sort (req1:Request<'a>) (req2:Request<'a>) =
    if req1.ResourceCondition.IsSome
    then
        -1
    else if req2.ResourceCondition.IsSome
    then
        1
    else
        0

let reqArray = Array.sortWith sort fifoArray

1 个答案:

答案 0 :(得分:11)

您的比较功能存在缺陷逻辑。尝试一步一步地运行它。看:如果req1req2都是Some,那么您的函数将返回-1。不是你期望的,不是吗?

我宁愿用模式匹配表达它:

let sort (req1:Request<_>) (req2:Request<_>) =
    match req1.ResourceCondition, req2.ResourceCondition with
    | None, Some _ -> 1
    | Some _, None -> -1
    | _ -> 0