如何避免更新List元素

时间:2012-11-27 11:11:51

标签: c# linq

我有以下代码根据Id。从上一条记录中复制新记录。

 //selecting the employee to be copied.
 Employee emp=employeeList.Where(p=>p.Id==2).Single();

 //Increasing the Employee Id.
 Employee NewEmp=new Employee();
 NewEmp=emp;
 NewEmp.Id=employeeList.Max(p=>p.Id)+1;

 //Adding to the List.
 employeeList.Add(NewEmp);

然而,新记录已成功添加。现有的记录ID也已更改为新的最大ID 3,因为它是上下文。

你可以请别人帮我停止更新现有的记录对象。

4 个答案:

答案 0 :(得分:1)

当你这样写:

Employee NewEmp=new Employee();
NewEmp=emp;

您创建新对象(第一行),然后(第二行)在变量NewEmp中指定“emp”,现在它们都引用同一个对象,因此实际上您使用一个对象。您实际创建的新员工将由GC收集。

你可以从价值类型和参考类型之间的差异中学到更多。

答案 1 :(得分:1)

你在这里做的分配:

Employee NewEmp=new Employee();

完全无效,新实例被以下行直接放弃:

NewEmp=emp;

您必须逐个字段地复制emp的内容(逐个属性)。在您的情况下,我建议在ICloneable - see MSDN上实施Employee以进行备案。

另一个选择包括:

但是,对于你预期的技能水平,我没有任何一种方式。


注意:通常的做法是使用小写字母来启动局部变量的名称,例如: 'newEmp'。

答案 2 :(得分:0)

您要将旧的Employee分配给NewEmp变量,并将NewEmp.Id更新为3.然后您再次将相同的Employee添加到列表中。因此,列表中有两个Employee Id = 3个{{1}}。

答案 3 :(得分:0)

这一行

newEmp = emp;

不会复制emp。它只是为内存中的相同位置创建一个新引用。因此有效empnewEmp是同一个但不是两个独立的内存块。阅读“参考类型”,例如在这里:http://www.albahari.com/valuevsreftypes.aspx