[英]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);
您获得指向所需用户的参考副本。 因此,有两个不同的引用指向此用户: 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
}
要么
更简单的方法:
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.