如何修改列表属性而不影响同类型的其他列表属性?

时间:2015-06-10 05:51:34

标签: c# .net list

这是我的示例代码,

Book

更改 public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } 对象的名称属性后,它还将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"; 的name属性值修改为'Test'。是什么原因&amp;我该如何避免呢?

6 个答案:

答案 0 :(得分:2)

这是因为你在两个列表中都放了同样的东西!

如果您希望每个列表的内容不同,则不要将相同的内容放入其中。

如果myClass实施IClonable,则可以使用

foreach (myClass data in source)
  myclass1.Add((myClass)data.Clone());

答案 1 :(得分:1)

这是因为data在两个列表中都相同。

要实现您需要将不同的数据放在第二个列表中,如下所示: -

var source2 = source.clone();

    foreach (myClass data in source2 )
      myclass2.Add(data);

答案 2 :(得分:1)

这是因为您使用引用类型,这意味着您只将实例的引用放入列表中,因此基本上您必须列出包含相同元素的引用。您可以使用值类型,但如果它具有引用类型字段,它仍将引用其中的同一对象实例。 你colud尝试克隆或serislise和deserislize对象,但在列表后将不包含来自源的元素只是他们的副本。

答案 3 :(得分:0)

myClass是引用类型。要解决此问题,您应该添加到data的第二个列表副本。

答案 4 :(得分:0)

列表通过引用存储,生成临时对象并添加到列表中。

foreach(myClass data in source)
{
    myClass tmpData = new myClass(){
        Something = data.Something;            
    };
    myClass1.Add(tmpData);
}

答案 5 :(得分:0)

详细了解值类型和引用类型之间的区别以及它们在c#中的工作方式。

请检查:What is the difference between a reference type and value type in c#?