C# 如何避免列表元素的更新
我有以下代码根据Id从以前的记录复制新记录C# 如何避免列表元素的更新,c#,linq,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; //Addin
//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也已更改为新的Max Id 3,因为它是上下文
你能不能请人帮我停止更新现有的记录对象。当你写这篇文章时:
Employee NewEmp=new Employee();
NewEmp=emp;
创建新对象(第一行),然后(第二行)在变量NewEmp中指定“emp”,现在它们都引用同一个对象,所以实际上使用一个对象。您实际创建的新员工将由GC收集
您可以从值类型和引用类型之间的差异中了解更多信息。您在此处执行的分配:
Employee NewEmp=new Employee();
完全无效,新实例立即被以下行放弃:
NewEmp=emp;
您必须按字段(按属性)复制emp
的内容。在您的情况下,我建议在Employee
-上实现ICloneable
,用于文档化
其他选择包括:
- 将
声明为结构李>Employee
- 使用
注:通常情况下,局部变量的名称以小写字母开头,例如“newEmp”。将旧的
员工
分配给newEmp
变量,并将newEmp.Id
更新为3。然后,您再次将相同的员工添加到列表中。因此,列表中有两个相同的员工Id=3
。这一行
newEmp = emp;
不复制emp
。它只是创建了一个对内存中相同位置的新引用。因此,实际上emp
和newEmp
是一个相同的内存块,但不是两个独立的内存块。阅读“引用类型”,例如:这里:为什么要创建一个新的员工
,然后将引用设置为旧的员工
?尝试阅读有关引用类型的内容:@khellang:因为他认为,分配引用将生成数据的副本。@Sravan,请查看C中的对象克隆()>在您的情况下,我建议实现IClonable—我不建议在任何地方实现IClonable
iClonable
是一件不应该发生的事情。@Dennis OP对您关于OP情况的陈述有何支持意见?O-O-Mapper是为OP想要做的事情而设计的。@Dennis OP甚至不理解引用的概念。在他看来,你怎么能推荐使用一种接近核反应堆工程的技术呢?这太荒谬了。他显然是个初学者。