【问题标题】:How to copy one list to another in C#如何在 C# 中将一个列表复制到另一个列表
【发布时间】:2016-02-28 20:58:12
【问题描述】:

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

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

我正在使用以下代码来执行此操作。在我设置好这个之后,再往前走,我正在更新employeeAddressDataToSave 列表。这些更改会自动进入“employeeAddressDataToSaveReturn”列表。我不希望我的 employeeAddressDataToSaveReturn 列表随着对 employeeAddressDataToSave 的更改而更新。有没有办法做到这一点?

employeeAddressDataToSaveReturn = new List<Address>(employeeAddressDataToSave);

【问题讨论】:

标签: c# list


【解决方案1】:

你正在执行它的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()

【讨论】:

    【解决方案2】:

    您的列表不包含地址数据项,它们包含地址数据项的引用。这些列表是分开的,这意味着如果您将对地址的引用添加到 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 中编辑了一个 item,你也会在另一个列表中修改它

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

    【讨论】:

      猜你喜欢
      • 2021-08-30
      • 2017-11-02
      • 2019-01-26
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      相关资源
      最近更新 更多