2013-08-21 3 views
0

Может ли кто-нибудь помочь мне с этим кодом, предположим, что он изменит свойства Lft и Rgt в отделе в списке selected_deparmtents. Проблема, с которой я сталкиваюсь, заключается в получении старого значения или предыдущего значения в переменной temp, которая содержит предыдущие свойства Lft и Rgt. То, что он делает, показывает обновленное значение свойства temp.Lft, которое неправильно. Я хочу, чтобы предыдущее свойство Lft выполняло калонирование. Кто-нибудь знает, как я могу обойти эту проблемуtemp value всегда показывает новое значение вместо старого значения

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++; 
} 
+0

Счетчик работает и петли для следующей записи в отчете еще, но он всегда показывает недавно обновлен элемент вместо старого элемента в клонах – ONYX

ответ

4

Проблема заключается в том, что вы на самом деле не получает достаточно глубокую копию в clonesList. Вместо этого у него есть копия всех ссылок на отделы, поэтому при ее обновлении она меняет значение в обоих.

Это выглядит поправимо в дальнейшем предполагается, что ваш 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)); 
} 
Смежные вопросы