あなただけが配列にキャストすることができ、それを平らにしたい場合:
colors |> Seq.cast<Color>
|> Seq.length //val it : int = 384000
方が便利だがArray2Dが本当に.NETコレクションであるArray2Dで何かがあるかもしれません。不揃いの配列やリストを扱うと、Seq.concat
またはcollect
にアクセスできます。
Add1を
ここでは、1Dリストに既にある:
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の良い候補であるかもしれません。パターンマッチングとともに、BlackとRedのアクティブなレコグナイザが定義され、次に、concatに供給され、最後に元のArray2Dに対してチェックされた2Dリストが生成されます。もちろん、Listで作業する必要はありません(例:遅延性の場合は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 to Array]の可能な複製(http://stackoverflow.com/questions/12870368/array2d-to-array) –