二维数组 - [| [||] |]的意义

时间:2011-12-07 07:26:02

标签: f#

定义了两个函数:

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])))

使用此代码处理空的二维字符串数组的工作/更好的方法是什么?

2 个答案:

答案 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

我很快对此进行了测试,它似乎也有效 - 尽管在访问数组时它可能仍会失败