如何在C#中将一个列表复制到另一个列表

本文关键字:列表 一个 复制 另一个 | 更新日期: 2023-09-27 18:24:41

我有一个要复制到另一个列表的列表。

我有"employeeAddressDataToSave"列表,我想将此列表复制到"employer eAddressDatatoSaveReturn"列表。

我使用以下代码来完成此操作。在我设置了这个之后,我将更新employeeAddressDataToSave列表。这些更改将自动进入"employeeAddressDataToSaveReturn"列表。我不希望我的employeeAddressDataToSaveReturn列表随employesAddressDataToSave的更改而更新。有办法做到这一点吗?

employeeAddressDataToSaveReturn = new List<Address>(employeeAddressDataToSave);

如何在C#中将一个列表复制到另一个列表

您正在执行列表的浅层复制,您需要执行列表的深层复制。列表是两个单独的列表,但列表中的项目在它们之间共享。如果您编辑一个项目,而不是列表本身,则编辑将同时显示在两者中。

在制作新列表时,您需要提供一些复制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包含嵌套的可变类,您还需要为它们编写一个Copy()方法,并递归调用Copy()

您的列表不包含地址数据项,它们包含对地址数据项的引用。列表是分开的,这意味着如果您将对地址的引用添加到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

但是,如果您编辑列表1中的项目,您也会在其他列表中修改它

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();