C# 在c(wpf)中复制两个ObservableCollection类型列表
我有以下Wpf课程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
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;