C#克隆一个交叉引用列表

标签 c# list clone

我有一个 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/

相关文章:

java - Eclipse 报告数组 clone() 方法来自其相应的类型(包括原语)?

drag-and-drop - 无需移动拖拽元素的 Konva 拖拽

c# - 如何使来自 Resources.resw 的字符串显示在设计器中?

时间:2019-05-17 标签:c#windowsmobile电池百分比

python - 合并两个列表python

c++ - 列表容器上的 std::set_difference

azure - 没有从 azure devops 克隆 Visual Studio 的选项吗?

c# - 知道 DLL 在什么上下文中运行

c# - 小方法的函数调用是否会消耗内存.....在C#中

Android - 如何检查按钮背景颜色是否与 View 中的前一个相同(以编程方式)