【问题标题】:New list updates original one新列表更新原始列表
【发布时间】:2020-05-05 18:26:33
【问题描述】:

我在这里使用此代码将一个列表复制到另一个列表

public class Person 
{
   public string Name { get; set; }
}

private void Form1_Load(object sender, EventArgs e)
{
    var originalList = new List<Person>();
    originalList.Add(new Person { Name = "name 1" });
    originalList.Add(new Person { Name = "name 2" });

    // var newList = originalList.ToList();
    var newList = new List<Person>(originalList);
    newList[0].Name = "New name";

    Console.WriteLine(originalList[0].Name);
}

我在控制台中的结果是“新名称”,为什么会这样?当我更新我的新列表时,它也会更新我原来的列表。我该如何解决这个问题?

【问题讨论】:

  • 您只完成了列表的克隆,而不是其中的每个项目。新列表具有与原始列表相同的项目。您正在修改两个列表中存在于 [0] 的实例。你需要做一个深拷贝。
  • 您的列表包含对象的引用。如果您创建一个新列表,您只需复制对这些对象的引用。如果您更改其中一个对象,则引用不会更改。
  • 这能回答你的问题吗? How do I clone a generic list in C#?
  • 这也不例外。可以这样想:你的老板让你在工作中加入第二个团队。那不会创建您的副本。到目前为止,您尝试过的任何操作都不会创建对象的副本,只会创建对这些对象的引用。

标签: c# list collections


【解决方案1】:

别担心,这是正常行为,你有原始列表,然后你有另一个列表由原始填充,在你的情况下,两个列表指向相同的项目,这意味着你有两个引用指向对于相同的记忆情况,为什么您从原始元素中更改元素的原因是相同的元素在第二个中更改,反之亦然。

案例一:

public class Person 
{
   public string Name { get; set; }
}

private void Form1_Load(object sender, EventArgs e)
{

   //here you have the original list, you create your list
   //you add element to your list .
   var originalList = new List<Person>();
   originalList.Add(new Person { Name = "name 1" });
   originalList.Add(new Person { Name = "name 2" });

   // you create a second list , but here the contain the
   // same element  than the original list
   var newList = new List<Person>(originalList);
   newList[0].Name = "New name";

   Console.WriteLine(originalList[0].Name);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    相关资源
    最近更新 更多