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.也可以用序列化反序列化的方法實現深度復制,見之前的文章。

深度復制可以完全復制出一個新的列表,用這種方法復制出來的列表里的項,是不能在原列表中找到的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM