Конвертировать 2D массив в список списков - PullRequest
1 голос
/ 25 октября 2019

Есть ли способ взять двумерный массив и получить список списков. Это кажется простой операцией, но я не могу найти способ сделать это. Этот код явно не работает:

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

1 Ответ

2 голосов
/ 25 октября 2019

Array2D (многомерный массив) и Jagged массивы (массив массивов) - это два разных типа. Вы можете увидеть это по типу сигнатур:

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

Если вам нужен многомерный массив, я предлагаю вам придерживаться его или использовать целевую библиотеку матриц сборки (например, math.net). List в F # - это односвязный неизменяемый список с некоторыми хорошими (легко создаваемыми и повторяемыми) и не очень хорошими (производительными) свойствами. AFAIK, 2D List отсутствует (может быть некоторая подходящая структура данных в расширенной базовой библиотеке).

Но вы можете легко конвертировать 2D-массив в список массивов или список списков, который является эквивалентом массива Jagged. Это одна строка:

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

val it: int list list = [[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;0]]

...