0

如何复制(并插入)列表中的最后一个对象。

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)。它实际上更大,有更多的子对象和列表。

4

4 回答 4

2

有两种常见的方式:

(1)为MyObject类编写一个Copy Constructor,并用它来制作对象的副本,然后插入副本。

(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());        
于 2012-12-04T15:07:07.147 回答
1

他们不是,你有四个MyObject,都不同。

如果要比较对象,则应根据值定义 equals 方法,如果这些是值对象。否则适当地定义等于。

读这个:

http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

编辑问题后编辑(我可以发誓它已被编辑!):

您应该编写一个接受另一个MyObject作为参数并复制值的构造函数。

由于字符串是不可变的,因此复制对它们的引用是安全的(而不是尝试复制字符串)。当您更改对象上的字符串值时a,不会影响对象b

顺便说一句,MyObject不是一个好名字的班级!

于 2012-12-04T15:05:31.403 回答
0

你正在进入克隆、浅拷贝和深拷贝的浑水。但是对于这样一个简单的类,您应该可以:

var newObj = new MyObject();
newObj.first = list[3].first;
newObj.second = list[3].second;

list.Add(newObj);

这只是因为 first 和 second 是字符串,因此分配不是通过引用。

此外,查看您当前的代码,您的列表将有 4 个不同的“MyObject”实例,最后一个实例没有任何“第一”或“第二”属性初始化。

于 2012-12-04T15:07:18.007 回答
0

如果您没有覆盖,则没有神奇的方法可以复制对象Clone。但这很简单:

MyObject last = list.Last();
list.Add(new MyObject{first = last.first, second = last.second});
于 2012-12-04T15:08:15.590 回答