繁体   English   中英

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

[英]How to copy one list to another in C#

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

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

我正在使用以下代码来做到这一点。 设置完之后,我将更新employeeAddressDataToSave列表。 这些更改将自动进入“ employeeAddressDataToSaveReturn”列表。 我不希望使用对employeeAddressDataToSave的更改来更新我的employeeAddressDataToSaveReturn列表。 有没有办法做到这一点?

employeeAddressDataToSaveReturn = new List<Address>(employeeAddressDataToSave);

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

制作新列表时,您将需要提供一些复制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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM