定义了两个函数:
let to2DStrArray (inObj : string[][]) =
Array2D.init inObj.Length inObj.[0].Length (fun i j -> inObj.[i].[j])
let toTypedList typeFunc (strArray : string[,]) =
if (Array2D.length1 strArray) = 0 then
[]
else
List.init (Array2D.length1 strArray) typeFunc
尝试从fsx调用它们失败如下:
let testData = to2DStrArray [|[||]|]
let failingCall = testData
|> toTypedList (fun row -> (Double.Parse(testData.[row,0]),
Double.Parse(testData.[row,1])))
使用此代码处理空的二维字符串数组的工作/更好的方法是什么?
答案 0 :(得分:3)
问题不在toTypeList
函数中,因此您无需检查strArray
是否为空。如果在输入数组为空时检查inObj.[0].Length
函数中的to2DStrArray
,则会出错。从数组数组创建Array2D的安全方法是使用array2D operator:
let to2DStrArray (inObj : string[][]) =
array2D inObj
当然,您必须保证所有内部数组都具有相同的长度。另一个功能缩短如下:
let toTypedList typeFunc (strArray : string[,]) =
List.init (Array2D.length1 strArray) typeFunc
根据您的用例,请注意 [| [||] |] 不是空字符串[] [];它是一个只包含一个元素的数组,而该元素又是一个空字符串数组。因此,它会导致您传递给toTypedList
的匿名函数出现问题。由于二维数组具有length2 <= 1
并且您访问两个第一个索引,因此它会生成绑定异常的索引。可以通过返回选项值来修复该函数,并且可以从选项值中提取值以便稍后使用:
let testData = to2DStrArray [|[||]|]
let failingCall = testData
|> toTypedList (fun row -> if Array2D.length2 testData >= 2 then Some (Double.Parse(testData.[row,0]), Double.Parse(testData.[row,1])) else None)
答案 1 :(得分:0)
实际上你会遇到另一个问题testdata.[0].Length <> testdata.[1].Length
- 除非你从其他地方知道这个问题。我怀疑是最好的方法
let ysize = (inobj |> Array.maxBy (fun t -> t.Length)).Length
我很快对此进行了测试,它似乎也有效 - 尽管在访问数组时它可能仍会失败