Это делается достаточно читабельным для операторов среза F # (теперь также в C# 8!). Чтобы нарезать многомерный массив, вы можете использовать .[range,range]
.
Например, .[*,n]
для n-го столбца и .[n,*]
для n-й строки.
Последний кусок, который нам нужен, это высота массива, которая равна измерению 0, заданному как
array.GetLength 0
Теперь нарезка 2D-массива с помощью понимания списка становится тривиальной.
[
let height = arr.GetLength 0
for row in 0..height-1 do
yield arr.[row,*] |> List.ofArray
]
Для ненулевых индексированных массивов, как предлагает Хенрик Хансен, предпочтительно использовать:
[
for i in arr.GetLowerBound(0)..arr.GetUpperBound(0)
do yield arr.[i,*] |> List.ofArray
]
Тест
let counter = ref 0
//generate the test array
let arr = Array2D.init (3) (3) (fun _ _ -> Interlocked.Increment(counter))
arr |> printfn "%A"
let lists =
[
let height = arr.GetLength 0
for row in 0..height - 1 do
yield arr.[row,*] |> List.ofArray
]
lists |> printfn "%A"
Вывод:
[[1; 2; 3]
[4; 5; 6]
[7; 8; 9]]
[[1; 2; 3]; [4; 5; 6]; [7; 8; 9]]