2016-02-23 36 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

只要'用戶'是一個類,並不是一個可變的結構:) –

回答

2

如果usersIEnumerable<>或引用類型(任何類),那麼你並不需要更新它。你已經做了。

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;

語法不正確 - 在=左側的項目必須是一個單一的,命名變量參考 - 試圖改變這樣的方法的返回值什麼都不做,因爲方法不能像那樣反向工作。