【问题标题】:List<T>.Add() objects which also include a List<T>List<T>.Add() 对象,其中还包括 List<T>
【发布时间】:2021-11-12 02:01:16
【问题描述】:

当我将一些 A 类的对象添加到我的 List 中时,我意识到,每当该对象发生变化时,尽管它一次又一次地被 new,list 的内容也会发生变化,这可能是因为存在按引用传递,我知道这一点。如何避免以下情况的变化:

List<A> listA;

List<B> listB = SomeFuncReturnsListB();

A a = new A();

a.Attribute1 = listB;

listA.Add(new A(){Attribute1=a.Attribute1}); 

【问题讨论】:

  • 你要什么?我很难理解。您是在问如何复制列表以便可以在不影响listB 的内容的情况下将项目添加到listA,还是在问深度克隆对象?
  • @Llama 问题是关于如何在不改变其内容的情况下将对象添加到listAlistA 的内容在给出的示例代码中不断变化。我的意思是说“不断变化”,列表的所有元素都会转到最后添加的元素。我的意图是原因可能是对象a中的listB
  • 您的意思是 listA 和 listB 都包含相同的项目,即使您向 listA 添加新项目?我看不到 listB 是如何“在”对象 A 中的。
  • 引用类型列表不存储实际对象,它存储对该对象的引用。因此,如果原始对象发生更改,列表中也会反映相同的更改。

标签: c# list collections


【解决方案1】:

您可以使用 .ToList() 进行克隆,而无需实现克隆功能。

例子:

a.Attribute1 = listB.ToList();

listA.Add(a); 

注意:您需要using System.Linq; 感谢@Matthew Watson

【讨论】:

  • 如何在 List 上调用 ToList?
  • @elizzybeth13 它正在使用 Linq;您需要将using System.Linq;放在代码文件的顶部才能使用它。
  • ^ 我想当然地认为我总是导入 Linq。我将编辑我的回复
  • 谢谢@Matthew Watson。是的,这行得通!也谢谢你 Hachiko001
  • 你也可以使用a.Attribute1 = new List&lt;B&gt;(listB);,我认为优化了一些
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2012-02-13
  • 1970-01-01
  • 2015-10-16
  • 2020-12-14
相关资源
最近更新 更多