Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#克隆交叉引用列表_C#_List_Clone - Fatal编程技术网

c#克隆交叉引用列表

c#克隆交叉引用列表,c#,list,clone,C#,List,Clone,我有我的物品清单。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 ----+ +---&

我有我的物品清单。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 ----+ 
List myList=new List();
myList.add(…)//添加所有8项
myList[1]。RefTo=myList[3];
myList[5].RefTo=myList[2];
myList[7].RefTo=myList[5];
项目0
项目1----+
+--->项目2|

|第3项您只需将列表序列化为内存流,然后反序列化并创建克隆。由于每个对象仅序列化一次,因此您的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);
            }
        }
    }
}
命名空间控制台应用程序1
{
[可序列化]
类MyItem
{
公共int MyProperty{get;set;}
公共MyItem引用到{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
List list1=新列表();
添加(新的MyItem(){MyProperty=1});
添加(新的MyItem(){MyProperty=2});
添加(新的MyItem(){MyProperty=3});
list1[1]。RefTo=list1[0];
list1[2].RefTo=list1[1];
使用(MemoryStream stream=new MemoryStream())
{
var bformatter=new BinaryFormatter();
序列化(流,列表1);
stream.Seek(0,SeekOrigin.Begin);
List clonedCopyList=(List)bformatter.Deserialize(stream);
}
}
}
}

我几乎想知道你是否需要克隆列表,而不是列表中的项目…+1,这可能是最简单的方法,而不是编写DeepCopy方法(可能更快?但肯定非常困难,尤其是对于枚举等),那么循环引用呢?从来没有想过这样做。石头!