2013-02-22 22 views
1

我有下面的類生成層次樹結構列表<T>用出來的深克隆,其中T是IClonable

public class DynaTreeNode 
{ 
    #region---Property--- 
    public string title { get; set; }  
    public string key { get; set; } 
    public object icon { get; set; } 
    List<DynaTreeNode> _children = new List<DynaTreeNode>(); 
    public List<DynaTreeNode> children 
    { 
     get { return _children; } 
     set { _children = value; } 
    }  
} 

我也有DynaTreeNode列表

List<DynaTreeNode> wholeTree = new List<DynaTreeNode>();//originally from DB 

現在我想克隆此列表收集到一個新的列表

待辦事項這我想使用

wholeTree.Select(i => i.Clone()).ToList(); 

在這種情況下,我需要實現IClonable接口到DynaTreeNode。但問題是IClonable不會做深層複製。從http://blogs.msdn.com/b/brada/archive/2003/04/09/49935.aspx

簡稱How do I clone a generic list in C#?

這個答案也使用IClonable。

如何克隆我的List與深拷貝?

注意:我想所有的孩子(列表)也應該克隆。

回答

3

如果性能是不是太大的問題,你可以使用序列來實現一個通用的深克隆的方法(例如,見this questionthis questionthis question,或者看看這個article)。

如果這不是一個選項(例如,由於性能方面的考慮),您必須實施專門的方法來克隆節點。例如,您的方法

wholeTree.Select(i => i.Clone()).ToList(); 

完全是valid。你自己實現的克隆方法當然可能會返回一個深層克隆(ICloneable沒有指定是深還是淺;這就是爲什麼很多人認爲ICloneable有害的原因)

+0

我已經提到過,我看到這篇文章http://stackoverflow.com/questions/222598/how-do-i-clone-a-generic -list-in-c。這本身有一個靜態方法DeepClone和使用序列化的答案。但想知道除了序列化以外還有其他方法:) – 2013-02-22 06:48:32

0

我的回答很簡單(對不起,我的英文不好對於難以回答:))

您可以使用遞歸選擇子元素。

你需要寫功能,這將是自調用和返回子元素