2011-11-11 16 views
4

私はMyItemsのリストを持っています。 MyItemは、そのピアを参照する場合と参照しない場合があります。c#クローン相互参照リスト

List<MyItem> myList = new List<MyItem>(); 
myList.add(...) //add all 8 items 
myList[1].RefTo = myList[3]; 
myList[5].RefTo = myList[2]; 
myList[7].RefTo = myList[5]; 

     Item 0 
     Item 1 ----+ 
    +---> Item 2  | 
    |  Item 3 <---+ 
    |  Item 4 
    +--- Item 5 <---+ 
     Item 6  | 
     Item 7 ----+ 

私はリスト全体のクローンを作成する必要があります。新しいリストのすべてのMyItemは、古いリストのMyItemsの新しいコピーです(参照しません)。新しいリストのすべての参照は、新しいリストの項目を指していなければなりません。その後、新しいリストは古いリストでも機能し、古いMyItemは完全に削除されます。

私は、MyItem.Clone()を呼び出して項目を複製できるように、MyItemでICloneableインターフェイスを実装しました。ただし、複製されたコピーは引き続き古いリストのMyItemsを参照しています。

MyItemsの参照を新しいリストのオブジェクトで更新するにはどうすればよいですか? サンプルコードは高く評価されます。

+0

など、望むようにあなたのRefToフィールドは、クローンコピーに保存されます一度、各オブジェクトが唯一のシリアル化されたようあなたがリストのクローンを作成する必要があるとしている場合、私はほとんど思ったんだけど、リスト内の項目ではない... – Daryl

答えて

7

単純に行うことは、リストをメモリストリームにシリアル化して逆シリアル化してクローンを作成することです。あなたは循環参照

namespace ConsoleApplication1 
{ 
    [Serializable] 
    class MyItem 
    { 
     public int MyProperty { get; set; } 
     public MyItem RefTo { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<MyItem> list1 = new List<MyItem>(); 
      list1.Add(new MyItem() { MyProperty = 1 }); 
      list1.Add(new MyItem() { MyProperty = 2 }); 
      list1.Add(new MyItem() { MyProperty = 3 }); 

      list1[1].RefTo = list1[0]; 
      list1[2].RefTo = list1[1]; 

      using (MemoryStream stream = new MemoryStream()) 
      { 
       var bformatter = new BinaryFormatter(); 
       bformatter.Serialize(stream, list1); 
       stream.Seek(0, SeekOrigin.Begin); 
       List<MyItem> clonedCopyList = (List<MyItem>)bformatter.Deserialize(stream); 
      } 
     } 
    } 
} 
+0

+1、恐らくディープコピー法を書くのではなく、もっとも簡単な方法です(より速いかもしれませんが、特にEnumerablesなどでは非常に困難です) – Rob

+0

循環参照はどうですか? –

+0

それはまた –

関連する問題