有没有人知道将C#中的2d数组(非锯齿状)压平为1d然后再返回的有效方法。我知道在后端C#必须保持它作为1d数组我想在后端1d数组上得到一个句柄,如果可能的话。
我之所以这样做是因为我希望能够在托管代码中将其作为2d,有时我想将其作为1d非托管dll导入代码(优化组装)在数字图像处理中就是一个很好的例子。)
答案 0 :(得分:11)
好吧,对象本身不是byte[]
,即使它将数据本身放在一个连续的内存块中。不要忘记阵列也知道它的等级和长度等。
但是,您可以使用Buffer.BlockCopy
快速复制阵列。例如:
byte[,] source = new byte[5,5];
byte[] dest = new byte[source.Length];
Buffer.BlockCopy(source, 0, dest, 0, source.Length);
请注意,最后一个参数是 bytes 的数量,而不是数组元素的数量。
答案 1 :(得分:3)
从2D索引转到1D索引:
int i = y * width + x;
然后回来:
int x = i % width;
int y = i / width;
然后最简单的是迭代你的数组,逐个复制值。
答案 2 :(得分:3)
您无法从byte[]
获取托管byte[,]
数组而不将其复制出去(不管怎么说,我都不知道)。
如果您对unsafe
代码感到满意,可以在阵列上修复byte*
,我相信这应该有效:
fixed (byte* ptr = array)
{
for (int i = 0; i < N; ++i)
{
byte b = ptr[i];
// Do whatever you need.
}
}
答案 3 :(得分:0)
var myFlattenedByteArray = my2DByteArray.SelectMany(b=>b).ToArray();
这将以子数组元素顺序返回2D字节数组的每个子数组的每个元素:myFlattenedByteArray [1] == my2DByteArray [0] [1]。可能有更多高性能或高效的解决方案(特别是SelectMany生成的Enumerable对它自己的阵列的淤塞),但它是一个单行的。