[英]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.