我有以下用于生成层次结构树结构的类
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)也应该被克隆。
答案 0 :(得分:3)
如果性能不是太大的问题,您可以使用序列化来实现一般的深度克隆方法(例如,请参阅this question,this question,this question或查看在此article)。
如果这不是一个选项(例如,由于性能问题),则必须实现克隆节点的专用方法。例如,您的方法
wholeTree.Select(i => i.Clone()).ToList();
完全是valid。你自己实现的克隆方法当然可以返回一个深层克隆(ICloneable不指定是深还是浅;这就是为什么许多人认为ICloneable有害的原因)
答案 1 :(得分:1)
我的回答很简单(对不起,我的英语很难回答:))
您可以对选择的子元素使用递归。
你需要写函数,它将调用self并返回子元素