C# 将阵列从二维展平到一维

C# 将阵列从二维展平到一维,c#,C#,假设我们有两个阵列: double[,] a = new double[width,height]; double[] b = new double[width*height]; 我们用一些数字填充a,比如0和1 为什么: for(int i = 0; i < a.GetLength(0); i++) for(int j = 0; j < a.GetLength(1); j++) b[i * a.GetLength(0) + j] = a[i,j]; fo

假设我们有两个阵列:

double[,] a = new double[width,height];
double[] b = new double[width*height];
我们用一些数字填充a,比如0和1

为什么:

for(int i = 0; i < a.GetLength(0); i++)
    for(int j = 0; j < a.GetLength(1); j++)
        b[i * a.GetLength(0) + j] = a[i,j];
for(int i=0;i

在b[]的所有字段中仅返回0?

您需要乘以第二维度的长度,而不是第一维度的长度:

b[i * a.GetLength(1) + j] = a[i,j];
除此之外,还有效率较低但更难搞乱的方法:

b = a.Cast<double>.ToArray();
b=a.Cast.ToArray();

添加以下行:

Debug.WriteLine("b[" + (i* a.GetLenth(1) + j) + "] = " + b[i * a.GetLength(1) + j]);

顺便检查一下发生了什么。将二维阵列转换为一维阵列的更有效方法是:

public static T[] ToPlainArray<T>(this T[,] array)
{
    Type type = typeof(T);
    int sizeInBytes = Marshal.SizeOf(type);
    T[] buffer = new T[array.Length];
    Buffer.BlockCopy(array, 0, buffer, 0, array.Length * sizeInBytes);
    return buffer;
}


int-Array.GetLenght(int-dimension)获取一个32位整数,表示系统指定维度中的元素数。数组,我认为它是VS2013中的标准。也是的,我运行调试器,它正确地在a数组上循环,在监视时显示正确的值,但由于某些原因,它不会将它们传递给b数组。因此,您没有注意到自己的键入
数组。GetLength
这就是为什么我问这是否是您自己的自定义方法。。它应该是
Array.GetLength
在我的例子中,a数组是16x16,所以我乘以哪个数组并不重要,只是为了确定,你是否(1)确定
a
不都是0,以及(2)确定此代码正在运行并且与问题中的代码匹配?@ChrisPitman你本来不应该回答这个问题,如果你不确定OP在他的代码中实际做了什么-1@Mihai我完全明白这个问题在问什么。我只是不确定海报问了他们需要问什么。Januszoff:你能创建一个简短完整的程序来显示你的问题并编辑问题吗?我认为这篇摘录之外的一些事情导致了您的问题。另一种故障安全且相当有效(我没有测量)的方法:
intidx=0;foreach(a中的var entry){b[idx]=entry;idx++;}
当然,您可以将递增放在前面的表达式语句中,以使循环中只有一条语句,但这可能会弄乱。由于.NET 4.5.1(从2013年开始,包含在Visual Studio 2013中),您可以直接使用更优雅的语句。
double[] b = a.ToPlainArray();
double[] b = ToPlainArray(a);