2016-02-23 2 views
0

Не уверен, что я собираюсь сделать это правильно, но хочу обновить определенные свойства объекта пользователя, содержащегося в списке пользователей, в зависимости от того, содержится ли он в другом списке.Обновление существующего объекта пользователя в цикле

Это то, что я пробовал.

foreach (var v in usersAssessment) 
{ 
    if (users.Select(t => t.Id).Contains(v.Id)) 
    { 
     var user = users.Where(p => p.Id == v.Id).FirstOrDefault(); 
     switch (v.ModuleCode) 
     { 
      case "M01": 
       user.M01 = v.ScoreObtained; 
       break; 
     } 
     //this is where I am trying to update the user but to no avail 
     users.Where(p => p.Id == v.Id).FirstOrDefault() = user; 
    } 
} 

Как обновить значения свойств?

Сердечные приветы

+2

Вы получаете ссылку (а не копию) на существующий объект из 'Where (...). FirstOrDefault()', поэтому обновление объекта будет обновлять то, что находится в списке. – crashmstr

+0

@crashmstr правильно, пользовательский объект будет иметь обновленное значение свойства M01. –

+1

До тех пор, пока 'user' является классом и не является изменяемой структурой :) –

ответ

2

Если users является IEnumerable<> или ссылочного типа (любой класс), то вам не нужно обновлять его. Ты уже сделал.

foreach (var v in usersAssessment) 
{ 
    var user = users.FirstOrDefault(p => p.Id == v.Id); 

    if(user != null) 
    { 
     switch (v.ModuleCode) 
     { 
      case "M01": 
       // This WILL update the selected user, if users is a collection of reference types. 
       user.M01 = v.ScoreObtained; 
       break; 
     } 
    } 
} 
1

В своем коде, когда вы запустите эту строку:

var user = users.Where(p => p.Id == v.Id).FirstOrDefault();

вы получили изменяемую ссылку на user объекта внутри списка. Таким образом, при выполнении

user.M01 = v.ScoreObtained;,

вы уже обновили пользователя и не нужно хранить его обратно в список.

На самом деле, линия

users.Where(p => p.Id == v.Id).FirstOrDefault() = user;

синтаксически неправильно - элемент слева от = должен быть один, названный ссылкой на переменную - пытается изменить возвращаемое значение метода, как это ничего не делает, потому что методы не работают в обратном порядке.

Смежные вопросы