我有一个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的引用? 示例代码将受到高度赞赏。
答案 0 :(得分:7)
您只需将列表序列化为内存流并将其反序列化并创建克隆。一旦您的 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);
}
}
}
}