Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免列表元素的更新_C#_Linq - Fatal编程技术网

C# 如何避免列表元素的更新

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

我有以下代码根据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也已更改为新的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甚至不理解引用的概念。在他看来,你怎么能推荐使用一种接近核反应堆工程的技术呢?这太荒谬了。他显然是个初学者。