复制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,因为它非常快。他们做了一些认真的汇编程序-foo以使其正常工作。 更新 我不确定这个修正有多接近,因为我还没有尝试过,但这就像我认为的那样:
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()
。如果一步无法解决问题,请将第一个多维数组复制到单维数组,然后将此单维数组复制到第二个多维数组。 参考文献: http://www.dotnetperls.com/buffer-blockcopy http://msdn.microsoft.com/zh-CN/library/system.buffer.blockcopy.aspx     
我的猜测是,这再简单不过了。似乎您正在从一个表面到另一个表面进行3D像素复制-如果没有硬件加速,我认为它必须一个接一个地进行。 好吧,如果您有多个核心,则每个核心使用一个线程可能会更快。 也许某人对certin有了更多的了解就会响... 作为一个脚注,我很好奇您的示例是非托管代码的性能明显优于...的情况。     

要回复问题请先登录注册