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

今天在游戏中碰到一个排序问题,就是有一个装备列表,是和服务器完全一致的,各种协议需要用到装备在这个列表中的序号。但是界面显示的时候需要按照各种方式来排序,但是不能在原来的列表上排序。因此需要复制出一个列表来,但是如何去复制这个列表,既能实现排序之后不会影响源列表,又要在排序之后,可以从原列表中找到装备的序号。所以顺便整理了下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);

2.
- List< T > oldList = new List< T >();
- oldList.Add(..);
- List< T > newList = oldList.CopyTo();

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

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

posted @ 2017-08-10 16:51  Net-Spider  阅读(18076)  评论(0编辑  收藏  举报