C#CopyinganArraybyValue我有一个MyType[]类型的类型化数组;我想制作这个数组的独立副本。我试过这个MyType[]types2=newMyType[types.Length];类型2=类型;但这创建了对第一个的引用。然后我尝试了Array.Copy(types,types2,types.Length);但我有同样的问题:更改第一个数组中的值也会更改副本中的值。如何创建数组、IList或IEnumerable的完整独立副本或深层副本?在MyType上实现克隆方法,使用受保护的方法MemberwiseClone(执行浅拷贝)或使用深克隆技术。您可以让它实现ICloneable,然后编写几个扩展方法来克隆相应的集合。接口ICloneable{TClone();}publicstaticclassExtensions{publicstaticT[]Clone(thisT[]array)whereT:ICloneable{varnewArray=newT[array.Length];for(vari=0;iClone(thisIEnumerableitems)whereT:ICloneable{foreach(variteminitems)yieldreturnitem.Clone();}}你必须这样做,因为当你使用Array.Copy时createanewarray,itcopiesReferences,notreferencedobjects.eachtypeisresponsibletocopyitself.根据第一篇文章,他需要的只是“数组的独立副本”。对shallowCopy数组本身的更改不会出现在types数组(意思是元素赋值,这实际上是他在上面展示的,尽管他说“深复制”)。如果这符合您的需要,它将具有最佳性能。MyType[]shallowCopy=(MyType[])types。Clone();他还提到了一个“深拷贝”,它对不是原始递归值类型聚合的可变类型产生了影响。如果MyType实现了ICloneable,这适用于深度复制:MyType[]deepCopy=(MyType[])Array.ConvertAll(element=>(MyType)element.Clone());对于不耐烦的人:newarray=newList(oldarray)。ToArray();如果您的类型是可序列化的,您可以使用序列化技术来获取数组的副本(包括项目的深层副本):formatter=newBinaryFormatter();格式化程序。序列化(流,输入);stream.Position=0;返回格式化程序。反序列化(流);要使用它:MyType[]items=newMyType[2];//填充数组中的项目MyType[]copies=(MyType[])GetCopy(items);我想做同样的事情:以排序的方式复制数组,以便稍后可以使用原始源数组重新创建它初始化另一个临时数组。经过研究,我发现这不可能那么简单。所以,我做了一个解决方法。我将在下面使用我自己的代码:string[]planetNames=newstring[]{"earth","venus","mars"};string[]tempNames=newstring[planetNames.Length];for(inti=0;iplanetNames是我的源数组。tempNames是我的数组,稍后我将独立于planetNames对其进行排序。我测试了这个,当我对tempNames进行排序时,这段代码不会对planetNames进行排序,这是我想要实现的.如果你想创建一个只包含对旧数组中对象的引用的数组副本(或者如果你有一个值类型对象数组),最简单的解决方案是varnewArray=oldArray.ToArray()如果你想要一个深拷贝,你应该有一个方法来复制你的类型的单个对象(例如publicMyTypeCopy(MyTypeobj))。然后解决方案看起来像varnewArray=oldArray.Select(x=>Copy(x)).ToArray()我发现如果你只想要一个简单的char数组副本,你可以欺骗C#使用charCopy按值执行它:char[]newchararray=newchar[desiredchararray.Length];for(intk=0;k似乎对我有用,但如果有人不同意请告诉我:)以上是C#学习教程:C#CopyArraybyValue如果分享的内容对你有用,你需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
