You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:37:45