我对F#很陌生,并且在调试一些代码时遇到了一些问题。下面的代码片段创建一个包含位置索引的矩阵。我有两个数组都包含字符串;一个数组从.CSV引入,另一个是硬编码的。
indexmatrix= Matrix |> Array.map (fun (j, _) -> load |> Array.findIndex (fun x -> x=j))
我收到的错误是:System.Collections.Generic.KeyNotFoundException,这意味着当我将鼠标悬停在该函数上时,根据F#无法找到匹配项。问题可能是这些值未正确存储在CSV中吗?或者我没想到的东西?
由于
答案 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
中每个元组中第一项的值。