复制列表中的对象

时间:2012-12-04 15:04:07

标签: c# list

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

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 个答案:

答案 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});