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.也可以用序列化反序列化的方法实现深度复制,见之前的文章。

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值