Array.Copy只有一个维度?

时间:2011-11-15 05:45:52

标签: c# .net

快速健全检查。 Array.Copy只用于一维数组,还是可以处理更多?

.Net Framework Array.Copy


当阅读规格时,我读它(可能是错误的)意味着匹配必须发生在第二个维度上。即。源索引和目标索引可以不同,我们可以指定元素的数量。

好的,所以让我们继续“匹配”。对于等级2的数组被复制到等级2的另一个等级,比如10x4到20x4,我们是说我们必须匹配尺寸一和二,或两个。我需要它只在第二个维度上。

是使用.net中的循环机制实现此目的的唯一方法。如果是这样,那将比块副本慢很多。


检查出来:

    static void Main(string[] args)
    {

        var A = new int[2,4] {{1, 1, 1, 1}, {2, 2, 2, 2}};

        var B = new int[4,4];
        var C = new int[4, 4];

        Array.Copy(A, 0, B, 4, 8);

        Array.ConstrainedCopy(A, 0, C, 8, 8); // haven't noticed this method before.  Same behaviour though.


    }

请注意,我们必须在世界的一维视图中指定正确的起点。我没想到这一点。

4 个答案:

答案 0 :(得分:2)

引自here

  

在多维数组之间进行复制时,数组的行为类似于   长一维数组,行(或列)所在的位置   概念上是端到端的。例如,如果数组有三行   (或列)每个有四个元素,复制六个元素   数组的开头将复制第一行的所有四个元素   (或列)和第二行(或列)的前两个元素。

答案 1 :(得分:1)

来自:Copy Method (Array, Array, Int32)

  

sourceArray和destinationArray参数必须相同   尺寸数量。

答案 2 :(得分:1)

只要源和目标匹配,它就支持单维和多维。

http://msdn.microsoft.com/en-us/library/k4yx47a1.aspx

  

sourceArray和destinationArray参数必须相同   尺寸数量。

     

在多维数组之间进行复制时,数组的行为类似于   长一维数组,行(或列)所在的位置   概念上是端到端的。例如,如果数组有三行   (或列)每个有四个元素,复制六个元素   数组的开头将复制第一行的所有四个元素   (或列)和第二行的前两个元素(或c

编辑:

以“端到端”的方式思考匹配。二维数组实际上只是连续的内存块 - 一个3 x 4 = 12个块。当它复制时,它将复制布局 - 端到端布局。关键是他们说它在概念上是端对端的。

答案 3 :(得分:0)

如果要从一维数组复制到数组数组(有点像使用中的多维数组),则只需在循环中使用Array.Copy即可。例如,我在尝试将BitmapData数组转换为更符合逻辑的数据时使用此位,就像二维数组一样。

Dim bitmapData As Imaging.BitmapData = myBitmap.LockBits(New Rectangle(0, 0, myBitmap.Width, myBitmap.Height), Imaging.ImageLockMode.ReadOnly, myBitmap.PixelFormat)

Dim size As Integer = Math.Abs(bitmapData.Stride) * bitmapData.Height
Dim data(size - 1) As Byte

Marshal.Copy(bitmapData.Scan0, data, 0, size)

Dim pixelArray(myBitmap.Height)() As Byte

'we have to load all the opacity pixels into an array for later scanning by column
'the data comes in rows
For y = myBitmap.Height - 1 To 0 Step -1
    Dim rowArray(bitmapData.Stride * 4) As Byte
    Array.Copy(data, y * bitmapData.Stride, rowArray, 0, bitmapData.Stride)
    pixelArray(y) = rowArray
Next