【问题标题】:Automatic type conversion of array contents using Array.Copy()使用 Array.Copy() 对数组内容进行自动类型转换
【发布时间】:2012-03-09 22:02:22
【问题描述】:

我正在尝试使用 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);

这用于从旧对象转换为新对象。内容完全一样,只是名称不同。

【问题讨论】:

  • the documentation 的哪一部分你不明白?
  • @M.Babcock - 你指的是那个(长)文档的哪一部分?
  • @HenkHolterman - 我不认为它可以更彻底。
  • @HenkHolterman 该文档不是很长。只有大约半页(如果有的话)描述类型转换。

标签: c# arrays constructor implicit-conversion


【解决方案1】:

有一种简单的方法可以进行这种转换,而不会让您自己或任何阅读您的代码的人产生疑问:使用 LINQ。

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

正如文档 here(由 cmets 中的 M.Babcock 指出)所说,Array.Copy 是一个 O(n) 操作。同样,我上面写的 LINQ 代码是 O(n) 操作,所以没有渐近性能损失(挂钟时间的实际性能取决于许多因素,所以我无法比较两种解决方案的运行时间没有分析),你知道这段代码是正确的。

也来自 MSDN 文档:

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

所以不,Array.Copy 不会“自动转换”,即在复制过程中实际创建 NewType 类型的新对象,但只会复制对 OldType 类型对象的引用并将这些引用放入 @987654326 @。

【讨论】:

  • “所以没有性能损失”。仅仅因为时间复杂度相同,并不意味着它们必须具有完全相同的性能。
  • @svick 当您发表评论时,我修改了答案,以包含对性能差异的更细致入微的描述。
猜你喜欢
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2014-11-11
  • 1970-01-01
相关资源
最近更新 更多