如何将3D数组映射到线性数组?

时间:2014-11-02 23:23:49

标签: c# arrays

我有一个3D数据阵列,代表一堆2D数据。在这种特殊情况下,堆栈只包含一个元素。 将此数据映射到线性数组的最快方法是什么?

我打算采取以下方法:

public static int[] ToBuffer<(this int[, ,] buffer3D, int w, int h)
  {
      int[] buffer = new int[w * h * 1];

      for (int i = 0; i < (w * h); i++)
      {
          buffer[i] = buffer3D[(int)Math.Floor(i / (double)w), i % w, 0];
      }

      return buffer;
   }

但我发现可能有某种方法可以利用数据已经存储在内存中的方式。是否应该在csharp中使用其他映射方法?

2 个答案:

答案 0 :(得分:1)

虽然你可能在这里使用一些Linq,但.ToArray()函数在内部使用一个具有设置大小的数组,然后在它变得太大时替换它 - 不像代码已经发布那样高效。 (见:class Enumerable on Reference Source

请注意,C#的主要优势,内存管理,也是这种优化的主要缺点 - 因为指针等是高度管理的,以这种方式访问​​它们以优化这样的代码通常要困难得多C#比其他语言。

答案 1 :(得分:1)

我想,为新数组创建新缓冲区并复制3d数组的缓冲区应该有效:

public static int[] ToBuffer(int[, ,] buffer3D, int w, int h) {
    int[] buffer = new int[w * h * 1];
    Buffer.BlockCopy(buffer3D, 0, buffer, 0, w * h * sizeof(int));
    return buffer;
}