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

时间:2017-02-01 15:40:59

标签: 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;

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

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

PS2:它在这个link中说FirstOrDefault选择了一个集合中的一个项目,但是没有&#34; detatch&#34;或&#34;克隆&#34;它。即它是同一个实例。 因此,如果修改属性,则修改原始实例。

我很困惑!

6 个答案:

答案 0 :(得分:6)

这样做:

var ss = SpreadsheetApp.getActiveSpreadsheet();

您获得指向所需用户的参考副本。因此,有两个不同的引用指向此用户:var userToUpdate = userList.FirstOrDefault(r => r.IdUser == 3); userToUpdate内的引用。

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

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

newUser

更简单的方法:

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

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

答案 1 :(得分:3)

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

然后在这一行:

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

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

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

答案 2 :(得分:1)

但是你并没有修改你正在修改变量值的属性。

尝试添加:

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

答案 3 :(得分:0)

因为这里

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

您获得的参考副本不是实际参考。

答案 4 :(得分:0)

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

{{1}}

答案 5 :(得分:0)

这样想:

集合是一个单元格网格,可以说是邮政信箱,在其中一个框中它包含了object1。你不确定在哪个方框中,通过调用.FirstOrDefault你问其他人&#39;去找你的细胞。您可以描述此对象的外观,在完成后,他会向您提供有关对象存储在哪个框中的信息。 (引用指向物理内存中对象位置的指针)。

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

你接下来做什么?你回到上一页并用第2页中包含记录的信息替换那里(第1页)写的内容:&#34;对象在餐厅里#34;。

然后你撕下页面,把它交给另一个人。说&#34;哟!我需要对object1进行一些更改,这里有带地址的文件,它可以帮助你找到它,去改变它&#34;。

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