使用Array.Copy()自动类型转换数组内容

时间:2012-03-09 22:02:22

标签: c# arrays constructor implicit-conversion

我试图使用Array.Copy()方法在c#中复制一些数组。这个方法应该自动进行类型转换,但是我想知道它是否会转换用户定义的类型,如果我要定义一个像这样的构造函数:

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 个答案:

答案 0 :(得分: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文档:

  

如果 sourceArray destinationArray 都是引用类型数组或者都是Object类型的数组,则执行浅复制。数组的浅表副本是一个新数组,包含与原始数组相同元素的引用。不复制元素本身或元素引用的任何内容。相反,Array的深层副本会复制元素以及元素直接或间接引用的所有内容。

所以不,Array.Copy不会“自动转换”,即在复制过程中实际创建NewType类型的新对象,但只会复制对OldType类型对象的引用并将它们放入newArray中的参考文献。