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

时间:2015-11-25 22:02:57

标签: c# list

我有一个列表,我想复制到另一个列表。

我有'employeeAddressDataToSave'列表,我想将此列表复制到' employeeAddressDataToSaveReturn'列表。

我使用以下代码执行此操作。在我进一步设置之后,我将更新employeeAddressDataToSave列表。这些更改会自动进入employeeAddressDataToSaveReturn'名单。我不希望更新employeeAddressDataToSave来更新employeeAddressDataToSaveReturn列表。有没有办法做到这一点?

employeeAddressDataToSaveReturn = new List<Address>(employeeAddressDataToSave);

2 个答案:

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