1

我有下面的类来生成层次树结构

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

现在我想将此列表集合克隆到一个新列表中

Todo this 我想用

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

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

参考如何在 C# 中克隆通用列表?

这个答案也使用 IClonable。

如何使用深拷贝克隆我的列表?.

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

4

2 回答 2

3

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

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

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

是完全有效的。你自己实现的 Clone 方法当然可能会返回一个深克隆(ICloneable 没有指定是深还是浅;这就是很多人认为 ICloneable 有害的原因)

于 2013-02-22T06:44:54.467 回答
1

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

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

您需要编写函数,该函数将调用 self 并返回子元素

于 2013-02-22T08:20:53.503 回答