可能是重复问题:
如何在C#中克隆一个泛型列表?
List<MyObject> a1 = new List<MyObject>();
var new1 = a1;
现在,如果我更改 a1
,那么 new1
也会被更改。
所以我的问题是如何正确地克隆 a1?
可能是重复问题:
如何在C#中克隆一个泛型列表?
List<MyObject> a1 = new List<MyObject>();
var new1 = a1;
现在,如果我更改 a1
,那么 new1
也会被更改。
所以我的问题是如何正确地克隆 a1?
这不会对列表中的每个项进行Clone
,但会为您创建一个新列表
var new1 = new List<MyObject>(a1);
如果你想克隆列表中的每个项,可以在 MyObject 上实现 ICloneable 接口。var new1 = new List<MyObject>(a1.Select(x => x.Clone()));
编辑:
为了让它更清晰一些,两者都将把列表a1
中的元素复制到一个新列表中。您只需要决定是要新的MyObject
还是保留原始对象。如果您想克隆MyObject
,则需要一种克隆它们的方法,通常是通过ICloneable
完成。
或者,您也可以这样做:
public static class CloneClass
{
/// <summary>
/// Clones a object via shallow copy
/// </summary>
/// <typeparam name="T">Object Type to Clone</typeparam>
/// <param name="obj">Object to Clone</param>
/// <returns>New Object reference</returns>
public static T CloneObject<T>(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<List<<MyObject>>(a1);
我认为通常的做法是避免使用Clone,因为它不清楚它是对象的浅拷贝还是深拷贝。
关于这个问题的更多信息: http://blogs.msdn.com/b/brada/archive/2004/05/03/125427.aspx
一个相当普遍的解决方案是使用BinaryFormatter类对对象进行序列化/反序列化,并返回新实例,但必须注意该类必须可序列化:
https://dev59.com/DnVC5IYBdhLWcg3w-WWs#1213649
假设以上情况,你可以这样做:
var clonedList = originaList.DeepClone();