[英]c# clone a cross-referencing list
我有一個MyItems列表。 MyItem可能會或可能不會引用其同行。
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的新副本(不是引用),新列表中的所有引用都應指向新列表中的項目。 最后,新列表甚至可以在舊列表中工作,並且舊的MyItems將被完全刪除。
我在MyItem中實現了ICloneable接口,因此可以通過調用MyItem.Clone()來克隆項目。 但是,克隆的副本仍然引用舊列表中的MyItems。
如何使用新列表中的對象更新MyItems的引用? 示例代碼將受到高度贊賞。
您只需將列表序列化為內存流並將其反序列化並創建克隆。 由於您希望包含循環引用,因此只有在您的RefTo字段將保留在克隆副本中時,每個對象才會被序列化
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);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.