Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不影响相同类型的其他列表属性的情况下修改列表属性?_C#_.net_List - Fatal编程技术网

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#中的工作方式的更多信息


选中此项:

您正在为每个列表添加引用,因此它们都指向同一个对象。要实现所需,需要创建对象的新实例并将其添加到第二个列表中。