繁体   English   中英

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

[英]Update an item in the list not working

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

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;

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

PS1:我不想更新Login值,我想更新User Object

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

我很迷惑!

这样做:

var userToUpdate = userList.FirstOrDefault(r => r.IdUser == 3);

您获得指向所需用户的参考副本。 因此,有两个不同的引用指向此用户: userToUpdateuserList内的引用。

当您指定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
}

要么

更简单的方法:

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

if (index != -1)
{
    userList[index] = newUser;        
}

其原因与对象在内存中的存储和引用方式有关。 当您最初将User对象添加到集合时,该集合将存储对每个对象的引用。

然后在这一行:

var userToUpdate = userList.FirstOrDefault(r => r.IdUser == 3);

您正在创建对上面列表中的一个对象的第二个引用。 但是,然后通过newUser分配newUser覆盖该引用: userToUpdate = newUser; IdUser值为3的原始用户的IdUser仍然在列表中保持不变。 您需要使用新元素替换列表中的该元素:

int toReplaceIndex = userList.FindIndex(r => r.IdUser == 3);

if (toReplaceIndex == -1)
{
    userList[toReplaceIndex] = newUser;
}
else
{
    // do whatever you want when the user ID being replaced doesn't exist.
}

但是您没有修改要修改变量值的属性。

尝试添加:

var ind = userList.IndexOf(userToUpdate);
userList[ind] = newUser;

想一想:

集合是一个单元格网格,比如邮局框,在其中一个框中它包含object1。 你不确定它是哪个盒子所以通过调用.FirstOrDefault你要求“其他人”去找你的单元格。 您可以描述此对象的外观,在完成后,他会向您提供有关对象存储在哪个框中的信息。 (引用指向物理内存中对象位置的指针)。

假设我们的userToUpdate是笔记本中的第1页,您写下了他告诉您的这些信息。 然后你转到下一页(第2页),它包含有关其他一些对象(newUser)的记录。

你下一步做什么? 你回到上一页并用第2页的信息替换那里写的(第1页),其中包含一条记录:“对象在餐厅里”。

然后你撕掉页面并把它交给“另一个人”说“哟!我需要对object1进行一些更改,这里有带地址的文件,它会帮助你找到它,去改变它”。

猜猜接下来会发生什么? 他会去餐厅。

因为在这里

var userToUpdate = userList.FirstOrDefault(r => r.IdUser == 3);

你得到一个参考的副本而不是实际的参考。

您所描述的是使用不同的对象实例替换列表中对象的实例,而不是更新实例。 你可以通过以下方式实现这一目标:

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 foundUser = userList.FirstOrDefault(item => item.IdUser == newUser.IdUser);
if(foundUser != null)
    userList.Remove(foundUser)
userList.Add(newUser);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM