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

次に、このリストコレクションを新しいリストに複製します

これをやろうと思っています

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

私の答えは簡単です(申し訳ありませんが、私は難しい答えのために悪い英語を持っています:))

選択したサブ要素に再帰を使用できます。

自己を呼び出してサブ要素を返す書き込み関数が必要です

于 2013-02-22T08:20:53.503 に答える