C# 在c(wpf)中复制两个ObservableCollection类型列表

C# 在c(wpf)中复制两个ObservableCollection类型列表,c#,wpf,observablecollection,C#,Wpf,Observablecollection,我有以下Wpf课程 public class test { public int id; public string name; } 还有两个我做对的ObservableCollection类型列表 private ObservableCollection<Test> ClassTest; private ObservableCollection<Test> TempClassTest; public MainWin

我有以下Wpf课程

 public class test
 {
     public int id;
     public string name;
 }
还有两个我做对的ObservableCollection类型列表

    private ObservableCollection<Test> ClassTest;
    private ObservableCollection<Test> TempClassTest;


    public MainWindow()
    {
        InitializeComponent();
        ClassTest = new ObservableCollection<Test>();
        TempClassTest = new ObservableCollection<Test>();
        ClassTest.Add(new Test() { id = 1, name = "T1" });
        ClassTest.Add(new Test() { id = 2, name = "T2" });
        ClassTest.Add(new Test() { id = 3, name = "T3" });
    }

现在ClassTest[0]的值是id=1110,在C-Read中是关于引用类型的。 System.Collections.ObjectModel.ObservableCollection是引用类型。以下代码行:

TempClassTest = ClassTest;
创建一个浅层副本,但不会创建完整的新成员列表

集合中的项也是ReferenceType,因此需要再次深度克隆该项

做一些类似于:

public class Test: ICloneable
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public object Clone()
        {
            return new Sample { Id = this.Id, Name = this.Name };
        }
    }
然后呢,

ObservableCollection<Test> coll1 = new ObservableCollection<Test>();
            coll1.Add(new Test{ Id = 1 });
            coll1.Add(new Test{ Id = 2 });
            coll1.Add(new Test{ Id = 3 });

ObservableCollection<Test> coll2 = new ObservableCollection<Test>();
            foreach (var item in coll1)
            {
                coll2.Add(item.Clone() as Test);
            }

            coll2[0].Id = 1500;

第一个变量对象被指定给第二个变量。因此,第一个变量和第二个变量指向相同的内存地址。所以,你改变第一个或第二个的任何值,它会影响两个变量

你使用克隆


你的问题是什么?是的,这就是它的工作方式。当您放置TempClassTest=ClassTest时,您的意思是使TempClassTest指向ClassTest指向的ObservableCollection的同一个实例。它没有复制ObservableCollection,也没有复制列表中的每个元素。这就是ObservableCollection的工作方式。读取它,您将ClassTest的引用分配给TempClassTest,所以两者都指向相同的内存位置。这就是为什么它也在更新ClassTest中的值;TempClassTest[0].id=1110;原因是集合中的项再次是引用类型。你也需要复制它。
ObservableCollection<Test> coll1 = new ObservableCollection<Test>();
            coll1.Add(new Test{ Id = 1 });
            coll1.Add(new Test{ Id = 2 });
            coll1.Add(new Test{ Id = 3 });

ObservableCollection<Test> coll2 = new ObservableCollection<Test>();
            foreach (var item in coll1)
            {
                coll2.Add(item.Clone() as Test);
            }

            coll2[0].Id = 1500;