我试图使用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);
这用于从旧对象转换为新对象。内容完全相同,名称不同。
答案 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
中的参考文献。