更新列表中的项目不起作用

Meh*_*egi 6 c# linq

我尝试使用此示例简化我的问题:

List<User> userList = new List<User>()
                {
                    new User {IdUser = 1, Login = "Frank" },
                    new User {IdUser = 2, Login = "Pat" },
                    new User {IdUser = 3, Login = "Max" },
                    new User {IdUser = 4, Login = "Paul" },
                    new User {IdUser = 5, Login = "John" }
                };

User newUser = new User()
    {
         IdUser = 3,
         Login = "Chris"
    };

var userToUpdate = userList.FirstOrDefault(r => r.IdUser == 3);
userToUpdate = newUser;
Run Code Online (Sandbox Code Playgroud)

为什么userList不包含Login = "Chris"该程序结束时的值?如何更新列表中的项目?

PS1:我不想更新Login值,我想更新用户对象

PS2:它在此链接中说FirstOrDefault选择集合中的项目,但不"分离"或"克隆"它.即它是同一个实例.因此,如果修改属性,则修改原始实例.

我很迷惑!

Rom*_*och 6

这样做:

var userToUpdate = userList.FirstOrDefault(r => r.IdUser == 3);
Run Code Online (Sandbox Code Playgroud)

您获得指向所需用户的参考副本.因此,有两个不同的引用指向此用户:userToUpdate和内部引用userList.

当您分配newUseruserToUpdate您时,列表中的一个引用仍然指向旧用户,并且您将获得userToUpdate指向的引用newUser.

要更新用户,您应该执行以下操作:

var index = userList.FindIndex(r => r.IdUser == 3);

if (index != -1)
{
    userList[index].Id = newUser.Id,
    //set all other properties from newUser
}
Run Code Online (Sandbox Code Playgroud)

要么

更简单的方法:

var index = userList.FindIndex(r => r.IdUser == 3);

if (index != -1)
{
    userList[index] = newUser;        
}
Run Code Online (Sandbox Code Playgroud)

  • `userList [index] = newUser`也可以 (3认同)