F#Seq.FindIndex从结束开始不是开始?

时间:2014-05-11 02:39:50

标签: f#

我有这个数组

let myArray = [1;2;3;5;2;7]

我想获得数字4,而不是Seq.FindIndex(fun x -> x=2) myArray的1 我可以反转阵列。但是我希望有Seq.FindIndexReverse函数....

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

如果反转阵列并没有为你剪掉,你自己怎么写?

let findLastIndex f arr = 
    let rec inner f arr idx = 
      match idx with
      | _ when idx >= 0 ->
         if f (arr.[idx])
            then Some idx
            else inner arr f (idx - 1)
      | _ -> None
    inner f arr (Array.length arr - 1) 

没有测试过,但是这样的事情应该有效。

顺便说一下,你给出了一个列表,而不是你的例子中的数组。您可以使用[| |]定义数组文字。

答案 1 :(得分:1)

由于不是非常“功能性”但有效的解决方案,您可以使用Array.LastIndexOf

答案 2 :(得分:1)

没有内置功能,但您可以轻松地结合自己的方式:

[1;2;3;5;2;7] |> List.rev |> List.findIndex (fun x -> x = 2)

但是,仍会返回1 ,因为倒数第二个元素也是 1

顺便说一句,你的列表是列表,而不是数组,但对于数组来说类似:

[|1;2;3;5;2;7|] |> Array.rev |> Array.findIndex (fun x -> x = 2)

答案 3 :(得分:1)

现在已经很晚了,但对于遇到这个问题的其他人来说可能会有用:

在F#4.0中,为findIndexBackArrayList添加了一个名为Seq的方法。这应该为你的功能返回4.

它没有在MSDN / GitHub上记录,但是提交在GitHub上,它出现在Visual Studio的Intellisense中。