2012-03-09 24 views
2

我正在嘗試使用Array.Copy()方法在c#中複製大量數組。這種方法被認爲自動類型轉換,但我想知道如果它會轉換用戶定義類型,如果我定義像這樣一個構造函數:在從傳統的對象轉換爲使用Array.Copy自動類型轉換數組內容()

OldType(){ 
int param1; 
String param2; 
} 

NewType(OldType old){ 
setParam1(old.param1); 
setParam2(old.param2); 
} 

OldType oldArray[]; 
NewType newArray[]; 

//will this automatically convert??? 
Array.Copy(oldArray, newArray); 

這是使用一個新的對象。內容完全一樣,名稱不同。

+1

[文檔](http://msdn.microsoft.com/en-us/library/k4yx47a1.aspx)的哪部分你不明白? – 2012-03-09 22:06:39

+2

@ M.Babcock - 你的意思是哪部分(長)文檔? – 2012-03-09 22:08:45

+0

@HenkHolterman--我認爲它不會更徹底。 – 2012-03-09 22:09:39

回答

0

有一種簡單的方法可以在不留下自己或任何人閱讀代碼的情況下進行轉換:使用LINQ。

OldType[] oldArray = /* Some logic */; 
NewType[] newArray = oldArray.Select(old => new NewType(old)).ToArray(); 

作爲文檔here(由M.Babcock在評論中指出)表示,Array.Copy是O(n)的操作。同樣,我上面寫的LINQ代碼是一個O(n)操作,所以沒有漸近的性能影響(掛鐘時間的實際性能取決於許多因素,所以我無法比較兩種解決方案的運行時間沒有分析),你知道這段代碼是正確的。

另外,從MSDN文檔:

如果sourceArraydestinationArray都是參考型陣列或是Object類型的兩個陣列,進行淺拷貝。 Array的淺拷貝是一個新的Array,它包含對原始Array的相同元素的引用。元素本身或元素引用的任何內容都不會被複制。相比之下,Array的深層副本會複製由元素直接或間接引用的元素和所有內容。

所以,不,Array.Copy不會「自動轉換」,即在複製過程中實際創建NewType類型的新對象,但會簡單地複製到OldType類型的對象的引用,並把這些引用的newArray

+2

「所以沒有性能影響」。只是因爲時間複雜性相同,並不意味着它們必須具有完全相同的性能。 – svick 2012-03-09 22:21:58

+0

@svick當你發表評論時,我修改了答案以包含對性能差異更細緻的描述。 – 2012-03-09 22:25:11