【问题标题】:Deep Clone of List<T> with out, where T is IClonable没有 out 的 List<T> 的深度克隆,其中 T 是 ICloneable
【发布时间】:2013-02-07 17:14:29
【问题描述】:

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

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 集合克隆到一个新的 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。

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

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

【问题讨论】:

    标签: c# collections clone


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我已经提到我读过这篇文章stackoverflow.com/questions/222598/…。这本身就有一个静态方法 DeepClone 的答案,并使用序列化。但想知道除了序列化还有其他方法吗:)
    【解决方案2】:

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

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

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

    【讨论】:

    猜你喜欢
    • 2010-12-14
    • 2020-11-19
    • 1970-01-01
    • 2010-09-14
    • 2010-10-06
    • 2016-05-18
    • 2010-09-27
    相关资源
    最近更新 更多