在F#中将int [,]转换为int [] []的简便方法

时间:2017-03-13 13:14:40

标签: f#

我们有两个数组

let a' = Array2D.init 1 1 (fun x y -> 1)

//START OF NOT WORKING PART//
double xstar;
double[] xoverhdarray = new double[] { -5, -4, -3 };
foreach (double xoverhd in xoverhdarray)
{
    if (xoverhd == -5)
    {
        xstar = (xoverhd + 0.5) * 2;
        MessageBox.Show(xstar.ToString());
    }
}
//NOT WORKING PART//

第一个返回int [] [],第二个返回int [,]

有没有简单的方法将int [,]转换为int [] []?

2 个答案:

答案 0 :(得分:3)

没有内置函数可以执行此操作。我会使用列表理解语法,这似乎很简单:

let a =
   [| for i in 0..(Array2D.length1 a' - 1) ->
         [| for j in 0..(Array2D.length2 a' - 1) -> a'.[i,j] |] |]

需要注意的一点是基本指数。在你的例子中,数组是从零开始的,所以我只使用了零来缩短代码。但是,如果您需要支持基于非零的数组的情况,则必须执行a'.[ i + Array2D.base1 a', j + Array2D.base2 a' ]。不是那么优雅,而是watchagonnado。

答案 1 :(得分:1)

如果您构建了您感兴趣的数组,则可以使用两个[][]构建Array.init(又称锯齿状数组)表单

e.g。

Array.init 10 (fun r -> Array.init 20 (fun c -> (c+r)))

[|[|0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19|]; [|1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20|]; [|2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21|]; ...