今天在游戲中碰到一個排序問題,就是有一個裝備列表,是和服務器完全一致的,各種協議需要用到裝備在這個列表中的序號。但是界面顯示的時候需要按照各種方式來排序,但是不能在原來的列表上排序。因此需要復制出一個列表來,但是如何去復制這個列表,既能實現排序之后不會影響源列表,又要在排序之后,可以從原列表中找到裝備的序號。所以順便整理了下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.也可以用序列化反序列化的方法實現深度復制,見之前的文章。
深度復制可以完全復制出一個新的列表,用這種方法復制出來的列表里的項,是不能在原列表中找到的。
