我有一个来自数据库的电话列表,我想克隆第一个条目并将其插入到同一个列表中(更新后的条目)。
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; }
}
答案 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
所做的任何更改都会更新obj
和p
,因为它们实际上只是对同一对象的引用。
将obj
(或p
)的每个属性的值复制到t
,而不是指定对同一对象的引用。
t.ID = obj.ID;
t.Phone = obj.Phone;