如何正确克隆List ?
可能重复:
如何在C#中克隆通用列表?
List a1 = new List(); var new1 = a1;
现在,如果我改变a1
那么new1
也将被改变。
所以我的问题是如何正确克隆a1 ?
这不会Clone
列表中的每个项目,但会创建一个新列表
var new1 = new List(a1);
如果要克隆列表中的每个Item,可以在MyObject
上实现ICloneable
var new1 = new List(a1.Select(x => x.Clone()));
编辑:为了使它更清晰,两者都将列表a1
的元素复制到新列表中。 您只需要决定是否要使用新的MyObject
或保留原件。 如果要克隆MyObject
,则需要一种克隆它们的方法,这通常通过ICloneable
完成。
或者,你可以这样做:
public static class CloneClass { /// /// Clones a object via shallow copy /// /// Object Type to Clone /// Object to Clone /// New Object reference public static T CloneObject(this T obj) where T : class { if (obj == null) return null; System.Reflection.MethodInfo inst = obj.GetType().GetMethod("MemberwiseClone", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); if (inst != null) return (T)inst.Invoke(obj, null); else return null; } }
然后使用它像:
var new1 = CloneClass.CloneObject>(a1);
我认为通常的做法是避免使用Clone,因为它不清楚它是否是对象的浅层和深层副本。
更多相关信息: http : //blogs.msdn.com/b/brada/archive/2004/05/03/125427.aspx
一个相当常见的解决方案是使用BinaryFormatter类来序列化/派生对象并返回新实例,但需要注意的是该类必须是可序列化的:
https://stackoverflow.com/a/1213649/1212407
假设上述情况,您可以:
var clonedList = originaList.DeepClone();
- .Net:如何创建独立于供应商的数据集,Tableadapters,绑定(DB在运行时决定)
- 什么原生dotNet数据类型最适合传递SQL Server hierarchyId值?
- 如何在Linq中添加两个列表,所以addedList = listOne + listTwo ?
- ConcurrentDictionary枚举和锁定
- 多个管道服务器实例的异步NamedPipes
- 如何在WCF中更改SOAP Envelope架构?
- 如何正确地重新抛出已经处于故障状态的任务的exception?
- 使用.NET Core中的字符串(配置文件)进行ServiceCollection配置
- 如何在XDocument中删除除root之外的节点的xmlns属性