簡體   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