复制C#多维数组元素的最有效方法是什么?

在C#中从一个多维数组复制到另一个多维数组时,嵌套循环的最有效方法是什么? 每个数组的上限和下限都不同,所以我不认为 Array.Copy()会为我做这个工作。 我目前有以下内容:

 for (int x = lower.X; x <= upper.X; x++) { for (int y = lower.Y; y <= upper.Y; y++) { for (int z = lower.Z; z <= upper.Z; z++) { copy[x, y, z] = Elements[x, y, z]; } } } 

这是一个相对较低级别的优化,编译器会为我处理这个问题吗? 当目标具有不同的上限和下限时,是否有更好的方法来复制多维数组的元素?

Array.Copy可以为你工作,但只能替换最里面的循环。 您必须自己计算源和目标指标,但这肯定是可行的。 Array.Copy(Array, Int32, Array, Int32, Int32)文档说明了如何对索引进行数学运算,以便指定源位置和目标位置。

我强烈建议在使用它的任何地方使用Array.Copy,因为它是疯狂的。 他们做了一些严肃的汇编程序,以使其运行良好。

UPDATE

我不确定这是多么接近,因为我没有尝试过,但这就像我认为的那样:

 int xLength = upper.X - lower.X + 1; int yLength = upper.Y - lower.Y + 1; int zLength = upper.Z - lower.Z + 1; Array copy = Array.CreateInstance(Elements.GetType(), new { xLength, yLength, zLength }, new {lower.X, lower.Y, lower.Z}); int skippedX = lower.X - Elements.GetLowerBound(0); int skippedY = lower.Y - Elements.GetLowerBound(1); int skippedZ = lower.Z - Elements.GetLowerBound(2); int sourceDim0Size = Elements.GetLength(1) * Elements.GetLength(2); int sourceDim1Size = Elements.GetLength(2); for (int x = 0; x < xLength; x++) { for (int y = 0; y < yLength; y++) { int destinationIndex = x * yLength * zLength + y * zLength; int sourceIndex = (x + skippedX) * sourceDim0Size + (y + skippedY) * sourceDim1Size + skippedZ; Array.Copy(Elements, sourceIndex, copy, 0, zLength); } } 

使用Buffer.BlockCopy() 。 如果它不能一步完成,则将第一个多维数组复制到单维数组中,然后将此单维数组复制到第二个多维数组。

参考文献:

我的猜测是,这不能变得更简单。 看起来你正在从一个表面到另一个表面进行三维像素复制 – 缺少硬件加速,我认为它必须逐个进行。

好吧,如果你有多个核心,那么每个核心的线程可能会更快。

也许知道更多certin的人会说…

作为一个脚注,我很好奇你的例子是非托管代码会明显超越的例子……