克隆或复制第一个对象并插入到同一列表中

时间:2015-03-17 04:24:11

标签: c# .net

我有一个来自数据库的电话列表,我想克隆第一个条目并将其插入到同一个列表中(更新后的条目)。

    List<Phones> p = new List<Phones>
    {
        new Phones { ID = 1, Phone = "Samsung S3" },
        new Phones { ID = 2, Phone = "iPhone 5" },
        new Phones { ID = 3, Phone = "Samsung S4" },
        new Phones { ID = 4, Phone = "Samsung S5" },
        new Phones { ID = 5, Phone = "iPhone 5s" },
        new Phones { ID = 6, Phone = "iPhone 6" },
    };

目前我使用了以下方法。但第一个条目也会更新。

    var obj = p.FirstOrDefault();
    var t = new Phones();

    t = obj;
    t.ID = 7;
    p.Add(t);


public class Phones
{
    public int ID { get; set; }
    public string Phone { get; set; }
    public bool isChild { get; set; }
}

3 个答案:

答案 0 :(得分:3)

那是因为您正在编辑同一个实例。您必须创建一个新对象,然后设置属性:

// this is already ok:
var obj = p.FirstOrDefault();
var t = new Phones();

// don't do this:
// t = obj;

// copy properties:
t.ID = obj.ID;
t.Phone = obj.Phone
t.isChild = obj.isChild

// add to list
p.Add(t);

但最好是,您应该实施ICloneable Interface并将该代码放入Clone()方法中(请参阅Peyman的回答)。

答案 1 :(得分:2)

类是通过引用调用的,所以如果你改变了值,也会改变第一个成员。您可以克隆Phone,但是您应该实现IClonable接口,只考虑此链接Implementing IClonable

public class Phones : ICloneable
    {
        public int ID { get; set; }
        public string Phone { get; set; }
        public bool isChild { get; set; }

        public object Clone()
        {
            return new Phones()
            {
                ID = this.ID,
                Phone = this.Phone,
                isChild = this.isChild
            };
        }
    }

答案 2 :(得分:0)

var obj = p.FirstOrDefault();

仅将p的引用分配给新对象obj。

t = obj; 

做同样的事情。对t所做的任何更改都会更新objp,因为它们实际上只是对同一对象的引用。

obj(或p)的每个属性的值复制到t,而不是指定对同一对象的引用。

t.ID = obj.ID;
t.Phone = obj.Phone;