实体类如下
class CWebPage
{
public Uri Uri; // E.g. http://www.google.com
public int Count; // E.g. 10
}
var list = new List<CWebPage>();
- 通过构造函数实现浅拷贝
var copy = new List<CWebPage>(list);
如果要对列表进行排序,那么浅拷贝很有用。在这种情况下,我们尤其不想要深层拷贝。我们不想复制列表项,只复制列表对象和指向它们的引用变量。
copy.Sort(delegate (CWebPage left, CWebPage right)
{
return left.Uri.Host.CompareTo(right.Uri.Host);
});
- 深拷贝:类要继承ICloneable并实现接口,本例使用foreach
class CWebPage : ICloneable
{
public Uri Uri;
public int Count;
// This is a deep copy implementation of Clone
public object Clone()
{
return new CWebPage
{
Uri = new Uri(this.Uri.OriginalString),
Count = this.Count,
};
}
}
var copy = new List<CWebPage>();
foreach(var elt in list)
{
copy.Add((CWebPage)elt.Clone());
}
- 使用list.foreach 实现深拷贝
var copy = new List<CWebPage>();
list.ForEach(delegate (CWebPage page)
{
copy.Add((CWebPage)page.Clone());
});
- 使用 ConvertAll 和 ICloneable
var copy = list.ConvertAll(elt => elt.Clone());
- 使用Select 和 ICloneable
var copy = list.Select(elt => elt.Clone()).ToList();
- 序列化反序列化
string serialized = JsonConvert.SerializeObject(list);
var copy = JsonConvert.DeserializeObject<List<CWebPage>>(serialized);
- 其他方式
var copy = Clone<CWebPage>(list);
public static List<T> Clone<T>(object List)
{
using (Stream objectStream = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objectStream, List);
objectStream.Seek(0, SeekOrigin.Begin);
return formatter.Deserialize(objectStream) as List<T>;
}
}