F#Array.findindex

时间:2018-03-09 09:58:28

标签: arrays indexing f#

我对F#很陌生,并且在调试一些代码时遇到了一些问题。下面的代码片段创建一个包含位置索引的矩阵。我有两个数组都包含字符串;一个数组从.CSV引入,另一个是硬编码的。

indexmatrix= Matrix |> Array.map (fun (j, _) -> load |> Array.findIndex (fun x -> x=j))

我收到的错误是:System.Collections.Generic.KeyNotFoundException,这意味着当我将鼠标悬停在该函数上时,根据F#无法找到匹配项。问题可能是这些值未正确存储在CSV中吗?或者我没想到的东西?

由于

1 个答案:

答案 0 :(得分:2)

让我们从工作示例开始:

let Matrix = [| (0,0); (1,0); (2,0)|]
let load = [| 0; 1; 2 |]
let indexMatrix =
  Matrix 
  |> Array.map (fun (j, _) ->
                  load 
                  |> Array.findIndex (fun x -> x = j))

// val indexMatrix : int [] = [|0; 1; 2|]

通过从load数组中删除所需的值来打破它:

let load = [| 0; 2 |] // missing the corresponding 1
let indexMatrix =
  Matrix 
  |> Array.map (fun (j, _) ->
                  load 
                  |> Array.findIndex (fun x -> x = j))

将抛出KeyNotFoundException

  

System.Collections.Generic.KeyNotFoundException: Exception of type 'System.Collections.Generic.KeyNotFoundException' was thrown.

     

问题可能是这些值未正确存储在CSV中吗?

可能,但最终这意味着Matrix中有元组的第一项在load中没有相应的值,这就是Array.findIndex调用抛出的原因。为了使此代码有效,load必须包含一个等于Matrix中每个元组中第一项的值。