2015-04-23 152 views
0

我試圖更新在C#中,看起來像這樣使用Linq更新嵌套列表值?

名單<Users>
嵌套列表 - 用戶類型
- 列表<UserComponents>
- - UserComponentKey
- - 計數

這裏有一個書面例如:
用戶列表: UserType = 1
UserComponents
- UserComponentKey = XYZ
- 計數= 3

用戶類型= 2個
UserComponents
- UserComponentKey = XYZ
- 計數= 7

我需要更新UserComponentKey XYZ的用戶類型2只,目前我更新已中斷,並更新所有用戶類型的XYZ。這是我當前的方法,它不工作,因爲它們更新包含指定組件密鑰的所有usertype的UserComponent計數值,而不是我所針對的特定usertype。

CLASSES:

public class Users 
{ 
    public string UserType { get; set; } 
    public List<UserComponent> UserComponents { get; set; } 
} 

public class UserComponent 
{ 
    public string UserComponentKey { get; set; } 
    public int Count { get; set; } 
} 

方法1:

Users.Where(us => us.UserType == "2") 
    .First().UserComponents 
    .Where(uc => uc.UserComponentKey == "XYZ") 
    .First().Count = value; 

方法2:

if(users.UserType == "2") 
{ 
    foreach(var component in users.UserComponents) 
    { 
     switch(component.UserComponentKey) 
     { 
      case "XYZ": 
      component.Count = value; 
      break; 
     } 
    } 
} 

碼生成LIST(類似): 列表UserComponents =新列表();

if (Item.UserAddOn != null) 
    { 
     for (var i = 0; i < Item.UserAddOn.First().Count; i++) 
     { 
      UserComponents.Add(new UserComponent 
      { 
       UserComponentKey = Item.UserAddOn[i].ComponentKey, 
       Count = 0 
      }); 
     } 
    } 

if (Item.User != null) 
    { 
     for (var i = 0; i < Item.User.First().Count; i++) 
     { 
      Users.Add(new User() 
      { 
       UserType = Item.User[i].ComponentKey, 
       Count = 0, 
       UsersComponents = UserComponents 
      }); 
     } 
    } 

我已經刪除了實際值等,但希望有人能指出我在這裏正確的方向。

謝謝!

+0

你的代碼是不安全的,但它應該工作。問題是什麼? – Pluc

+0

它們當前更新包含指定組件密鑰的所有usertype的UserComponent計數值,而不是我指定的特定usertype。 – Dan

+0

所以,如果我有4個usertypes,所有與組件鍵「J32S」所有四個將使用這些方法更新。 – Dan

回答

0

我缺少的信息來編寫你可以使用這樣一個片段,我會簡單地解釋它。一個對象變量實際上是一個引用(一個指針,如果你熟悉C++/C)到對象所在的位置。當你添加一個對象到列表中時,你可以添加它的位置。如果將此對象添加到多個列表中,則會給出相同的位置,因此編輯其中一個將編輯所有這些對象。

var uc1 = new UserComponent { Count = 1 }; 
var uc2 = new UserComponent { Count = 2 }; 
var uc3 = new UserComponent { Count = 2 }; 

var u1 = new User(); 
var u2 = new User(); 

u1.UserComponents.Add(uc1); 
u1.UserComponents.Add(uc2); 

u2.UserComponents.Add(uc1); 
u2.UserComponents.Add(uc3); 

Console.Write(u1.UserComponents[0].Count); //Outputs 1 
Console.Write(u1.UserComponents[1].Count); //Outputs 2 
Console.Write(u2.UserComponents[0].Count); //Outputs 1 
Console.Write(u2.UserComponents[1].Count); //Outputs 2 

u2.UserComponents[0].Count = 5; 
u2.UserComponents[1].Count = 6; 

Console.Write(u1.UserComponents[0].Count); //Outputs 5 
Console.Write(u1.UserComponents[1].Count); //Outputs 6 
Console.Write(u2.UserComponents[0].Count); //Outputs 5 
Console.Write(u2.UserComponents[1].Count); //Outputs 2 

所以你的代碼更改值是好的,但是當你建立你的列表,你需要,如果他們不連接在一起,以創建獨特的UserComponents。

+0

我們已經解決了。就像你建議它在列表生成一樣。我已經把列表生成分離出來了,它被調用來自動創建空白組件。謝謝。 – Dan

0

您的第一個電話First()是錯誤的。試着這樣說:

Users.Where((us) => us.UserType == "2") 
    .Select((us) => us.UserComponents) 
    .Where((uc) => uc.UserComponentKey == "XYZ") 
    .First() 
    .Count = value; 

建議:你爲什麼不做出UserTypeint

+1

因爲usertype實際上是一個字符串,現在就試試這個。 – Dan

+0

如果這不是導致您的問題的原因,那麼您所有的'UserType'都具有相同的值(2)。 –

+0

這不一定是真的。如果將UserComponent(XYZ)的相同實例添加到每個用戶,則修改它在一個用戶中似乎就像您在每個用戶中更改它一樣。這就是爲什麼我要求生成他的列表的代碼。 – Pluc

0

可能是它幫助:

 List<Users> _users = new List<Users>(); 
     _users.Add(new Users() { UserType = "1", UserComponents = new List<UserComponent>() { new UserComponent() { Count = 0, UserComponentKey = "XYZ" } } }); 
     _users.Add(new Users() { UserType = "2", UserComponents = new List<UserComponent>() { new UserComponent() { Count = 2, UserComponentKey = "XYZ" } } }); 
     _users.Add(new Users() { UserType = "3", UserComponents = new List<UserComponent>() { new UserComponent() { Count = 5, UserComponentKey = "XYZ" } } }); 

     _users.Where(us => us.UserType == "2").First().UserComponents.Where(uc => uc.UserComponentKey == "XYZ").First().Count = 356; 

     foreach (Users us in _users) 
     { 
      Console.WriteLine("UserType: " + us.UserType); 
      foreach (UserComponent uc in us.UserComponents) 
      { 
       Console.WriteLine("Key: {0} Value: {1}", uc.UserComponentKey, uc.Count); 
      } 
     }