C#中List的浅复制和深复制

源列表是List< T >

T是值类型的情况
浅复制:

  • List< T > oldList = new List< T >();
  • oldList.Add(…);
  • List< T > newList = oldList;

深复制:

  • List< T > oldList = new List< T >();
  • oldList.Add(…);
  • List< T > newList = new List< T >(oldList);

T不是值类型的情况
T是引用或者是类的实例
注意用List newList = oldList;这种方法不是复制,而是添加了一个引用;
浅复制:
1.

  • List< T > oldList = new List< T >();
  • oldList.Add(…);
  • List< T > newList = new List< T >(oldList);
  • List< T > oldList = new List< T >();
  • oldList.Add(…);
  • List< T > newList = oldList.CopyTo();

-List< T > oldList = new List< T >();

  • oldList.Add(…);
  • List< T > newList = oldList.CopyTo();

以上方法都可以实现类似的效果,并且复制出来的列表中的项,可以在源列表中用IndexOf之类的方法找到,所以这些也是游戏中可以用的方法,当然还有ToList()这样转换成数组的方法。除了这种复制之外,也可以用Dictionary来保存原来的键值,做一个对应。

深复制:
1.

  • static class Extensions
  • {
  • public static IList< T > Clone< T >(this IList< T > listToClone) where T: ICloneable
  • {
  • return listToClone.Select(item => (T)item.Clone()).ToList();
  • }
  • //当然前题是List中的对象要实现ICloneable接口
  • }

2.也可以用序列化反序列化的方法实现深度复制,见之前的文章。

深度复制可以完全复制出一个新的列表,用这种方法复制出来的列表里的项,是不能在原列表中找到的。

你可能感兴趣的:(C#杂摘,数据结构,浅复制深复制,List复制)