将2D数组转换为列表列表

时间:2019-10-24 22:24:22

标签: multidimensional-array f#

有没有办法获取2D数组并获取列表列表。这似乎是一个简单的操作,但我找不到解决方法。 这段代码显然行不通:

let arr = Array2D.create 4 4 0
let listOfLists = arr |> List.ofArray

1 个答案:

答案 0 :(得分:2)

Array2D(多维数组)和锯齿状数组(数组数组)是两种不同的类型。您可以从类型签名中看到它:

let arr = Array2D.create 4 4 0 // int[,]
let arrJagged = toJagged arr // int [][]

如果您需要一个多维数组,建议您坚持使用它或使用专用的构建矩阵库(例如math.net)。 F#中的List是一个单链接的不可变列表,具有一些不错的(容易创建和递归)而不是那么好的(性能)属性。 AFAIK,没有2D列表(扩展核心库中可能有一些适当的数据结构)。

但是您可以轻松地将2D数组转换为数组列表或列表列表,这与锯齿状数组等效。这是一个班轮:

[for i in 0 .. 3 -> arr.[*,i] |> Array.toList]

  

val it:int列表= [[0; 0; 0; 0]; [0; 0; 0; 0]; [0; 0; 0; 0];   [0; 0; 0; 0]]

或更笼统:

let toListList arr = 
    [for x in 0 .. Array2D.length1 arr - 1 ->
        [ for y in 0 .. Array2D.length2 arr - 1 -> arr.[x, y] ]
    ]
  
    

toListList arr ;;
    val it:int list list = [[0; 0; 0; 0]; [0; 0; 0; 0]; [0; 0; 0; 0]; [0; 0; 0; 0]]