如何正确克隆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();