簡體   English   中英

使用Linq更新嵌套列表值?

[英]Updating nested list values with Linq?

我正在嘗試更新C#中的嵌套列表,如下所示

列出<Users >
- 用戶類型
-列出<UserComponents >
--UserComponentKey
--計數

這是一個書面示例:
用戶列表:UserType = 1
用戶組件
-UserComponentKey = XYZ
-計數= 3

用戶類型= 2
用戶組件
-UserComponentKey = XYZ
-計數= 7

我只需要為UserType 2更新UserComponentKey XYZ,當前我的更新已損壞,並且為所有用戶類型更新XYZ。 這是我目前無法使用的方法,因為它們會更新所有包含指定組件鍵而不是我定位的特定用戶類型的用戶類型的UserComponent計數值。

類:

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

代碼生成列表(類似於):列表UserComponents = new List();

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
             });
         }
     }

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

謝謝!

您第一次調用First()是錯誤的。 像這樣嘗試:

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

建議:為什么不將UserTypeint

可能有幫助:

        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);
            }
        }

我缺少寫一個可以使用的代碼段的信息,所以我將僅作解釋。 實際上,對象變量是對對象駐留位置的引用(如果您熟悉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

因此,您可以使用代碼來更改值,但是在建立列表時,如果未將它們鏈接在一起,則需要創建不同的UserComponent。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM