List <t>的深度克隆没有,其中T是ICloneable </t>

时间:2013-02-22 06:29:20

标签: c# collections clone

我有以下用于生成层次结构树结构的类

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

现在我想将此List集合克隆到新列表

Todo我正在考虑使用

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

在这种情况下,我需要为DynaTreeNode实现IClonable接口。但问题是IClonable不会做深层复制。来自http://blogs.msdn.com/b/brada/archive/2003/04/09/49935.aspx

提到How do I clone a generic list in C#?

这个答案也使用了IClonable。

如何使用深层复制克隆我的列表?

注意:我希望所有的孩子(List)也应该被克隆。

2 个答案:

答案 0 :(得分:3)

如果性能不是太大的问题,您可以使用序列化来实现一般的深度克隆方法(例如,请参阅this questionthis questionthis question或查看在此article)。

如果这不是一个选项(例如,由于性能问题),则必须实现克隆节点的专用方法。例如,您的方法

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

完全是valid。你自己实现的克隆方法当然可以返回一个深层克隆(ICloneable不指定是深还是浅;这就是为什么许多人认为ICloneable有害的原因)

答案 1 :(得分:1)

我的回答很简单(对不起,我的英语很难回答:))

您可以对选择的子元素使用递归。

你需要写函数,它将调用self并返回子元素