C# 如何在不影响相同类型的其他列表属性的情况下修改列表属性?
这是我的示例代码C# 如何在不影响相同类型的其他列表属性的情况下修改列表属性?,c#,.net,list,C#,.net,List,这是我的示例代码 List<myClass> myclass1 = new List<myClass>(); List<myClass> myclass2 = new List<myClass>(); //add data to myClass1 from source foreach (myClass data in source) myclass1.Add(data); //add data to myClass2 from source
List<myClass> myclass1 = new List<myClass>();
List<myClass> myclass2 = new List<myClass>();
//add data to myClass1 from source
foreach (myClass data in source)
myclass1.Add(data);
//add data to myClass2 from source
foreach (myClass data in source)
myclass2.Add(data);
//Change name property only for myclass1
foreach (myClass data in myclass1)
data.Name = "Test";
List myclass1=新列表();
List myclass2=新列表();
//将数据从源添加到myClass1
foreach(源中的myClass数据)
myclass1.添加(数据);
//从源代码向myClass2添加数据
foreach(源中的myClass数据)
myclass2.添加(数据);
//仅更改myclass1的name属性
foreach(myclass1中的myClass数据)
data.Name=“Test”;
在更改
myclass1
对象的name属性后,它还将myclass2
的name属性值修改为“Test”。原因是什么?我如何避免 这是因为您将相同的内容放在两个列表中
如果您希望每个列表的内容不同,那么不要将相同的内容放入其中
如果myClass
实现了IClonable
,那么您可以使用
foreach (myClass data in source)
myclass1.Add((myClass)data.Clone());
myClass
是引用类型。要解决此问题,应将数据的副本添加到第二个列表中 这是因为两个列表中的数据都是相同的
为了实现这一目标,您需要将不同的数据放入第二个列表中,如下所示:-
var source2 = source.clone();
foreach (myClass data in source2 )
myclass2.Add(data);
这是因为您使用引用类型,这意味着您只将实例的引用放在列表中,因此基本上您必须列出包含相同元素的列表。您可以使用值类型,但如果它有引用类型字段,它仍将引用其中的同一对象实例。
您可以尝试克隆或序列化并反序列化对象,但在列表中不包含源中的元素后,只包含它们的副本。列表通过引用存储,生成临时对象并添加到列表中
foreach(myClass data in source)
{
myClass tmpData = new myClass(){
Something = data.Something;
};
myClass1.Add(tmpData);
}
了解有关值类型和引用类型之间的差异以及它们在c#中的工作方式的更多信息
选中此项:您正在为每个列表添加引用,因此它们都指向同一个对象。要实现所需,需要创建对象的新实例并将其添加到第二个列表中。