如何复制(和插入)列表中的最后一个对象。
public class MyObject
{
public string first {get;set;}
public string second {get;set;}
}
List<MyObject> list = new List<MyObject>();
list.Add(new MyObject{first = "one", second = "two"});
list.Add(new MyObject{first = "here", second = "there"});
list.Add(new MyObject{first = "car", second = "plane"});
MyObject newObj = new MyObject();
list.Add(newObj);
似乎列表中的最后两个对象是对同一对象的引用。如何创建仍然是列表中最后一个对象的副本的新对象?
修改 对于这个例子,我不应该简化我的问题和类(实际上不是MyObject)。对于更多的子对象和列表,它实际上要大得多。
答案 0 :(得分:2)
有两种常见方式:
(1)为MyObject类编写复制构造函数,并使用它来制作对象的副本,然后插入副本。
(2)或者为MyObject类编写 Clone 方法,并使用它来制作副本,然后插入副本。
但是,在您提供的代码中,您不会复制任何内容,也不会在列表中插入对现有对象的引用。
这是一个如何做到的例子:
public class MyObject
{
public string first
{
get;
set;
}
public string second
{
get;
set;
}
public MyObject DeepClone()
{
return new MyObject{ first = this.first, second = this.second;}
}
}
// Then you can do this:
List<MyObject> list = new List<MyObject>();
list.Add(new MyObject{first = "one", second = "two"});
list.Add(new MyObject{first = "here", second = "there"});
list.Add(new MyObject{first = "car", second = "plane"});
list.Add(list[list.Count-1].DeepClone());
答案 1 :(得分:1)
他们不是,你有四个MyObject
,都不同。
如果要比较对象,则应根据值定义等于方法(如果这些是值对象)。否则,适当地定义等于。
阅读本文:
http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx
编辑问题后编辑(我可以发誓它已被编辑!):
您应该编写一个接受另一个MyObject
作为参数的构造函数并复制这些值。
由于字符串是不可变的,因此可以安全地复制对它们的引用(而不是尝试复制字符串)。当您更改对象a
上的字符串值时,这不会影响对象b
。
顺便说一句,MyObject
不是一个好名字!
答案 2 :(得分:0)
你正在进入克隆,浅浅和深抄的黑暗水域。 但是对于这样一个简单的类,你应该没问题:
var newObj = new MyObject();
newObj.first = list[3].first;
newObj.second = list[3].second;
list.Add(newObj);
这只是因为第一个和第二个是字符串,因此赋值不是通过引用。
另外,查看当前代码,您的列表将有4个不同的“MyObject”实例,最后一个实例没有“first”或“second”属性初始化为任何内容。
答案 3 :(得分:0)
如果您没有覆盖Clone
,则没有神奇的方法可以复制对象。但它很简单:
MyObject last = list.Last();
list.Add(new MyObject{first = last.first, second = last.second});