我有一个列表,我想复制到另一个列表。
我有'employeeAddressDataToSave'列表,我想将此列表复制到' employeeAddressDataToSaveReturn'列表。
我使用以下代码执行此操作。在我进一步设置之后,我将更新employeeAddressDataToSave列表。这些更改会自动进入employeeAddressDataToSaveReturn'名单。我不希望更新employeeAddressDataToSave来更新employeeAddressDataToSaveReturn列表。有没有办法做到这一点?
employeeAddressDataToSaveReturn = new List<Address>(employeeAddressDataToSave);
答案 0 :(得分:2)
您正在执行shallow copy of the list, you need to perform a deep copy。该列表是两个单独的列表,但列表中的项目在它们之间共享。如果您编辑项目而不是列表本身,则编辑将显示在两者中。
制作新列表时,您需要提供一些复制Address
的方法。
employeeAddressDataToSaveReturn = new List<Address>(employeeAddressDataToSave.Select(x=>x.Copy());`
现在调用Address.Copy()
方法(您需要编写),它将返回自身的副本。
这是一个简单的例子,你没有展示Address
所以我必须要做一个
class Address
{
public string Street {get;set;}
public string Zip {get;set;}
public Address Copy()
{
var result = new Address();
result.Street = this.Street;
retult.Zip = this.Zip;
return result;
}
}
如果Address
包含嵌套的mutable类,您还需要为它们编写Copy()
方法,并递归调用Copy()
。
答案 1 :(得分:1)
您的列表不包含地址数据项,它们包含用于处理数据项的引用。列表是分开的,这意味着如果您向list2添加对地址的引用,则不会将其添加到list1:
var list1 = GetList1();
Console.WriteLine(list1.Count); // 3
var list2 = new List(list1);
list2.Add(new AddressData("John Doe", "Foo street", "12345");
Console.WriteLine(list1.Count); // 3
Console.WriteLine(list2.Count); // 4
但是,如果您在list1中编辑项目,您还将在其他列表中修改它
Console.WriteLine(list1[2].Name); // Bob
Console.WriteLine(list2[2].Name); // Bob
list2[2].Name = "Jim";
Console.WriteLine(list1[2].Name); // Jim <-- Changed
Console.WriteLine(list2[2].Name); // Jim
如果要制作深层副本,请在地址类上实施复制/克隆方法,并逐项复制整个列表
list2 = list1.Select(a => a.Copy()).ToList();