【问题标题】:is Array.Copy only one dimension?是 Array.Copy 只有一维吗?
【发布时间】:2013-03-01 06:45:44
【问题描述】:

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

.Net Framework Array.Copy


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

好的,让我们来了解一下“匹配”。对于一个秩为 2 的数组被复制到另一个秩为 2 的数组中,比如 10x4 到 20x4,我们是说我们必须在维度 1 和 2 上匹配,还是只匹配两个维度。我需要它只在第二个维度上。

是在 .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.


    }

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

【问题讨论】:

  • 您是否阅读过您提供的链接中的任何方法页面?
  • @Alastair Pitts:是的。请参阅更新的问题。目前正在查看适用于 1 级数组但不适用于 2 级(或可能更多)的实时代码。因此问题。
  • 关键是文档中对“端到端”的引用。这是端到端的每个维度的布局。编辑了我的答案...

标签: c# .net


【解决方案1】:

引用here:

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

【讨论】:

    【解决方案2】:

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

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

    sourceArray 和destinationArray 参数必须相同 维数。

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

    编辑:

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

    【讨论】:

    • 我想我现在到了那里(参见编辑中的代码示例)。认为我期待更丰富的功能。我可以带着这个想法工作。谢谢。
    【解决方案3】:

    发件人:Copy Method (Array, Array, Int32)

    sourceArray 和destinationArray 参数必须相同 维数。

    【讨论】:

      【解决方案4】:

      如果你想从一维数组复制到一个数组数组(这有点像多维数组的用法),你只需要在循环中使用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
      

      【讨论】:

        猜你喜欢
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多