F#遍历二维数组报错:类型'obj'不支持枚举语法的问题咨询
F# 二维数组遍历错误解决
为啥报错?
你用for i in g遍历二维数组时踩了个坑:F#的Array2D类型没法直接被for...in当成行序列来遍历,它本身没实现seq<_>或IEnumerable<_>接口,直接遍历的话会被识别成obj类型,自然就报枚举错误了。
几种正确的遍历方式
1. 用索引循环(最通用)
直接通过行列索引访问元素,不管哪个F#版本都能用:
// 创建3x3的int类型二维数组,初始值0 let g = Array2D.create<int> 3 3 0 // 遍历每一行 for i in 0 .. g.GetLength(0) - 1 do // 遍历当前行的每一列 for j in 0 .. g.GetLength(1) - 1 do printf "%d " g[i,j] // 每行结束换行 printfn "" printfn ""
2. 转成行序列遍历(F# 6+推荐)
F# 6及以上版本可以用Array2D.rows模块方法,直接把二维数组转成行的序列:
open FSharp.Collections.Array2D let g = Array2D.create<int> 3 3 0 // 直接遍历每一行 for row in rows g do // 遍历当前行的每个元素 for elem in row do printf "%d " elem printfn "" printfn ""
要是用的旧版F#,可以手动提取每行:
let g = Array2D.create<int> 3 3 0 for i in 0 .. g.GetLength(0) - 1 do // 提取第i行的一维数组 let row = g[i,*] for elem in row do printf "%d " elem printfn "" printfn ""
3. 扁平化遍历所有元素
如果不需要按行分组,只想把所有元素挨个遍历,可以直接这么写——注意是列优先顺序(先第一列所有行,再第二列):
let g = Array2D.create<int> 3 3 0 for elem in g do printf "%d " elem printfn ""
内容的提问来源于stack exchange,提问作者Emanuel Boștină
相关产品推荐
相关产品推荐

