C#三维数组转三个一维数组及元素访问问题
解决C#三维数组拆分为一维数组的问题
你踩的坑其实是对C#三维数组的索引规则不熟悉——float[,,]是三维矩形数组,必须用三个索引才能定位到元素,你之前用两个索引array3d[i, 0]肯定会编译报错。
根据你描述的数组结构{[a0,b0,c0], [a1,b1,c1], [a2,b2,c2]...},你的三维数组应该是第一个维度对应每组数据的序号(比如从0到length-1),第二个维度固定为0(因为每组就是三个值),第三个维度用来区分a/b/c(0对应a,1对应b,2对应c)。
修正后的循环代码
直接调整索引写法就能解决问题:
// 获取第一个维度的长度,也就是你说的length int length = array3d.GetLength(0); float[] a = new float[length]; float[] b = new float[length]; float[] c = new float[length]; for (int i = 0; i < length; i++) { // 三维数组必须传三个索引:组序号、第二个维度索引、值的位置索引 a[i] = array3d[i, 0, 0]; b[i] = array3d[i, 0, 1]; c[i] = array3d[i, 0, 2]; }
额外建议:用二维数组更合适
其实从你的需求来看,存储一组组的三个浮点值,使用二维数组float[,](比如定义为float[length, 3])会更贴合场景,这时候访问方式就和你最初尝试的一致了:
int length = array2d.GetLength(0); float[] a = new float[length]; float[] b = new float[length]; float[] c = new float[length]; for (int i = 0; i < length; i++) { a[i] = array2d[i, 0]; b[i] = array2d[i, 1]; c[i] = array2d[i, 2]; }
用LINQ简化代码(可选)
如果不想写循环,引用System.Linq后可以用一行代码生成每个一维数组:
// 三维数组的情况 float[] a = Enumerable.Range(0, array3d.GetLength(0)) .Select(i => array3d[i, 0, 0]) .ToArray(); float[] b = Enumerable.Range(0, array3d.GetLength(0)) .Select(i => array3d[i, 0, 1]) .ToArray(); float[] c = Enumerable.Range(0, array3d.GetLength(0)) .Select(i => array3d[i, 0, 2]) .ToArray(); // 二维数组的情况 float[] a = Enumerable.Range(0, array2d.GetLength(0)) .Select(i => array2d[i, 0]) .ToArray();
内容的提问来源于stack exchange,提问作者Jaume
相关产品推荐
相关产品推荐

