如果你只是想壓平它,你可以將它轉換爲一個序列:
colors |> Seq.cast<Color>
|> Seq.length //val it : int = 384000
可能有東西在Array2D這是更方便,但Array2D確實是一個.NET集合。您可以使用不齊整的陣列或列表,然後您可以訪問Seq.concat
或collect
。
ADD1
這已經是在一維列表:
let colors = [for i in 0..799 do
for j in 0..479 ->
if (i % 3 = 0) || (j % 3 = 0) then Color.Black
else Color.Red]
隨着活動模式
根據實際的複雜性,這也可能是active patterns一個很好的候選。定義黑色和紅色的主動識別器的下方,連同模式匹配,然後生成2D列表,將其輸入到concat,最後針對原始Array2D進行檢查。您當然不需要使用列表(例如,可以將seq用於懶惰或Array用於性能)。
let (|Black|Red|) input = if fst input % 3 = 0 || snd input % 3 = 0 then Black else Red
let matchColor =
function
|Black -> Color.Black
|Red -> Color.Red
let color3 = List.init 800 (fun i -> List.init 480 (fun j -> matchColor (i,j)))
let color4 = color3 |> List.concat
color4 |> Seq.length
colors
|> Array2D.mapi (fun i j x -> color3.[i].[j] = colors.[i,j])
|> Seq.cast<bool>
|> Seq.filter not
[Array2D到陣列]的可能的複製(http://stackoverflow.com/questions/12870368/array2d-to-array) –