在C#中更改列表值也会更改您的复制元素

时间:2018-03-10 23:22:23

标签: c# list object

我有一个对象列表,我将它们通过参数传递给一个函数。我想用一些不同的值来编辑它!因为当我从列表中更改项目时,它是否也会从Pessons列表中更改?它就像访问相同的内存位置,但我只想复制列表并更改它而不会导致更改其他列表。

 public void GerarPorLider(List<Person> Persons)
 {
     List<Person> p = Persons;
     p[0].Amount += 10;
 }

执行此代码时发生的输出

  

人[0] .Amount = 17; p [0] .Amount = 17;

我期待它的方式

  

人[0] .Amount = 7; p [0] .Amount = 17;

我该怎么做?

1 个答案:

答案 0 :(得分:4)

这一行

List<Person> p = Persons;

不复制Persons列表,它会为其创建别名。您对p所做的任何修改实际上都是Persons列表的修改,只是通过不同的别名。

此外,列表中的Person对象也需要复制。

假设有Person的构造函数需要复制Person,请使用以下方法:

List<Person> p = Persons.Select(x => new Person(x)).ToList();

如果Person没有复制构造函数,请一次复制一个属性:

List<Person> p = Persons.Select(x => new Person {
    // I am making up the properties of `Person` to be copied;
    // you need to use the actual ones.
    Name = x.Name
,   LastName = x.LastName
,   Address = x.Address
}).ToList();