我有一个 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 接口(interface),因此可以通过调用 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);
}
}
}
}
关于C#克隆一个交叉引用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089785/