我试图用这个例子简化我的问题:
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;它。即它是同一个实例。 因此,如果修改属性,则修改原始实例。
我很困惑!
答案 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;。
猜猜接下来会发生什么?他会去餐厅。