作者:Jacky麦麦9 | 来源:互联网 | 2024-09-29 13:08
C#按值复制数组我有一个类型化的数组MyType[]types;我想制作这个数组的独立副本。我试过这个MyType[]types2newMyType[types.Length];t
C#按值复制数组
我有一个类型化的数组MyType[] types;
我想制作这个数组的独立副本。 我试过这个
MyType[] types2 = new MyType[types.Length] ; types2 = types ;
但这会创建对第一个的引用。 然后我试过了
Array.Copy( types , types2 , types.Length ) ;
但我有同样的问题:更改第一个数组中的值也会更改副本中的值。
如何创建Array,IList或IEnumerable的完全独立或深层副本?
在MyType上实现克隆方法,使用受保护的方法MemberwiseClone(执行浅拷贝)或使用深度克隆技术。 您可以让它实现ICloneable然后编写几个扩展方法来克隆相应的集合。
interface ICloneable { T Clone(); } public static class Extensions { public static T[] Clone(this T[] array) where T : ICloneable { var newArray = new T[array.Length]; for (var i = 0; i Clone(this IEnumerable items) where T : ICloneable { foreach (var item in items) yield return item.Clone(); } }
您必须执行此操作,因为在使用Array.Copy时创建新数组时,它会复制引用,而不是引用的对象。 每种类型都负责复制自己。
基于第一篇文章,他所需要的只是“数组的独立副本”。 对shallowCopy
数组本身的更改不会出现在types
数组中(意思是元素赋值,这实际上是他在上面展示的内容,尽管说“深拷贝”)。 如果这符合您的需求,它将具有最佳性能。
MyType[] shallowCopy = (MyType[])types.Clone();
他还提到了一个“深层复制”,它对于不是基元的递归值类型聚合的可变类型会有所不同。 如果MyType
实现ICloneable
,这适用于深层复制:
MyType[] deepCopy = (MyType[])Array.ConvertAll(element => (MyType)element.Clone());
对于不耐烦:
newarray = new List(oldarray).ToArray();
如果您的类型是可序列化的,则可以使用序列化技术获取数组的副本(包括项目的深层副本):
private static object GetCopy(object input) { using (MemoryStream stream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, input); stream.Position = 0; return formatter.Deserialize(stream); } }
要使用它:
MyType[] items = new MyType[2]; // populate the items in the array MyType[] copies = (MyType[])GetCopy(items);
我想做同样的事情:按照排序的方式为数组制作一个数组副本,这样我以后可以用原始源数组重新初始化另一个临时数组。 在研究了这个之后,我发现这不可能这么简单。 所以,我做了一个解决方法。 我将在下面使用我自己的代码:
string[] planetNames = new string[] { "earth", "venus", "mars" }; string[] tempNames = new string[planetNames.Length]; for (int i = 0; i
planetNames是我的源数组。 tempNames是我稍后将独立于planetNames排序的数组。 我测试了这个,当我对tempNames进行排序时,这个代码并没有对planetNames进行排序, 而这正是我试图实现的。
如果要创建仅包含旧数组中对象引用的数组的副本(或者如果您有值类型对象的数组),最简单的解决方案是
var newArray = oldArray.ToArray()
如果你想要深层复制,你应该有一个复制你的类型的单个对象的方法(例如public MyType Copy(MyType obj)
)。 然后解决方案看起来像
var newArray = oldArray.Select(x => Copy(x)).ToArray()
我发现如果你只是想要一个简单的char数组副本,你可以使用char来欺骗C#按值进行复制:
char[] newchararray = new char[desiredchararray.Length]; for (int k = 0; k
似乎为我工作,但如果有人不同意请告诉我:)
上述就是C#学习教程:C#按值复制数组分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---编程笔记