2011-11-15 37 views
1

快速完整性檢查。 Array.Copy僅適用於一維數組,還是可以處理更多?是Array.Copy只有一個維度?

.Net Framework Array.Copy


在讀我讀它的規格(可能是錯誤的)意味着比賽必須在第二個維度進行。即。源索引和目標索引可以不同,我們可以指定元素的數量。

好吧,讓我們磨合一下「搭配」吧。對於等級2的數組被複制到另一個等級爲2的數組中,比如說10x4到20x4,我們是否說我們必須匹配維度1,2和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. 


    } 

注意,我們必須指定在世界上的一個維視圖正確的出發點。我沒有想到這一點。從here

+0

你甚至讀過你提供的鏈接中的任何方法頁嗎? –

+0

@Alastair Pitts:是的。請參閱更新的問題。目前正在查看可用於排名1的陣列但不適用於排名2(或可能更多)的實時代碼。因此,這個問題。 – sgtz

+0

關鍵是對文檔中的「端到端」的引用。這是每個維度的端到端佈局。編輯我的答案... – bryanmac

回答

1

只要源和目的地匹配,它就支持單維和多維。

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

的sourceArray和destinationArray參數必須具有相同的 維數。

當在多維數組之間進行復制時,該數組的行爲類似於一個長的一維數組,其中行(或列)是 概念上首尾相連。例如,如果一個數組有三行 (或列),每個都有四個元素,從數組開頭複製六個元素將複製第一行 (或列)的所有四個元素,以及第一行的第一個兩個元素第二行(或c

編輯:

匹配的方式的認爲它勾畫出「端到端」的二維陣列實際上只是連續的存儲器塊 - 一個3×4 = 12個塊。 。當它複製時,它將複製佈局 - 端到端佈局。關鍵是他們說它在概念上是端到端地鋪設的線。

+0

請看到更新的問題。我正在努力爭取「比賽」。編輯爲匹配 – sgtz

+0

- 希望是有道理的。 – bryanmac

+0

想想我現在到了那裏(請參閱編輯中的代碼示例)。認爲我期待着稍微豐富的功能。我可以用這個想法來工作。謝謝。 – sgtz

2

引用:

當多維數組之間複製,陣列表現得像 長一維陣列,其中,所述行(或列)是 概念性地鋪設端到端。例如,如果一個數組有三行 (或列),每個都有四個元素,從數組開頭複製六個元素將複製第一行 (或列)的所有四個元素,以及第一行的第一個兩個元素第二行(或列)。

0

如果您想從單維數組複製數組(這與使用中的多維數組相似),您只需在循環中使用Array.Copy即可。例如,當我試圖讓一個BitmapData數組變成更具邏輯性的數組時,我使用了這一點,就像一個2維數組。

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 
相關問題