临时值总是显示新值而不是旧值

本文关键字:新值 显示 | 更新日期: 2023-09-27 18:28:43

有人能帮我写这段代码吗?假设要更改selected_documentents列表中某个部门的Lft和Rgt属性。我遇到的问题是在临时变量中获取旧值或以前的值,该变量包含以前的部门Lft和Rgt属性。它所做的是显示temp.Lft属性的更新值,这是错误的。我希望以前的Lft属性进行计算。有人知道我该怎么解决这个问题吗

int counter = 0;
int lft = department.Lft;
int rgt;
Department temp;
List<Department> clones = new List<Department>(selected_departments);                   
foreach (Department dept in selected_departments)
{
    if (counter < 1)
    {
       rgt = (dept.Rgt - dept.Lft);                            
       dept.Lft = lft;
       dept.Rgt = lft + rgt;
    }
    else
    {                                                        
        temp = clones.ElementAt(counter - 1); // <-- incorrect 
        // previous departments value should be old value 
        lft = lft + (dept.Lft - temp.Lft);// here temp.Lft always show the newly updated value
        rgt = lft + (dept.Rgt - dept.Lft);
        dept.Lft = lft;
        dept.Rgt = rgt;
    }
    db.Entry(dept).State = EntityState.Modified;
    db.SaveChanges();            
    counter++;
}

临时值总是显示新值而不是旧值

问题是在clones List中实际上没有获得足够深的副本。相反,它有一个对部门的所有引用的副本,所以当您更新其中一个时,它会更改两者的值。

假设您的Department构造函数为左侧和右侧取一个参数,则可以通过以下方法解决此问题:

List<Department> clones = new List<Department>(selected_departments.Count);                   
for (int i = 0; i < selected_departments.Count; i++)
{
    clones.Add(new Department(selected_departments[i].Lft, selected_departments[i].Rgt));
}