C# 中的“List.Remove”不会删除项

本文关键字:删除 Remove 中的 List | 更新日期: 2023-09-27 18:36:39

您好,我如何从通用列表中删除项目,这是我的代码,我试图正确完成它,但我不知道我在哪里犯了错误;/

Users us_end = new Users();
foreach (var VARIABLE in ((List<Users>)Application["Users_On"]))
{
    if(VARIABLE.Id == (int)Session["Current_Id"])
    {
        us_end.Name = VARIABLE.Name;
        us_end.Id = VARIABLE.Id;
        us_end.Data = VARIABLE.Data;
    }
}
List<Users> us = ((List<Users>)Application["Users_On"]);
us.Remove(us_end);
Application["Users_On"] = us;

C# 中的“List.Remove”不会删除项

您必须删除相同的对象,而不是副本。

Users us_end;
foreach (var VARIABLE in ((List<Users>)Application["Users_On"]))
{
    if(VARIABLE.Id == (int)Session["Current_Id"])
    {
       us_end = (Users)VARIABLE;
       break;
    }
}
if (us_end != null)
{
    List<Users> us = ((List<Users>)Application["Users_On"]);
    us.Remove(us_end);
    Application["Users_On"] = us;
}

编辑:

只是为了澄清这里的地址,正如 pst 所指出的那样,您还可以实现 IEquatable 接口和一些覆盖,例如 Groo 的答案以使其工作,但我认为在这个特定主题上矫枉过正。将此作为最常见的做法,但要明确也可以从列表中删除项目,即使它们是不同的实例,甚至是使用此类技术的不同对象。

参考: http://msdn.microsoft.com/en-us/library/ms131187.aspx

默认情况下,在 .NET 中通过引用比较对象相等性(除非Equals被重写,否则每个对象都继承自 object.Equals )。如果希望 Remove 方法查找对象,则无法传递新对象。

最简单的方法是找到具有所需属性的实际对象,然后将其删除:

var id = (int)Session["Current_Id"];
var list = (List<Users>)Application["Users_On"];  
// find the exact item to remove.
var itemToRemove = list.FirstOrDefault(u => u.Id = id);
// if found, remove it
if (itemToRemove != null)
{
    list.Remove(itemToRemove);
}

您正在创建一个新的Users对象 - 这与Application["Users_On"]中已有的任何对象不同(它将具有不同的引用),因此不会将其删除。

这假设Equals和/或IEquatable<T>未在Users中被覆盖/实现。

List<Users> us = ((List<Users>)Application["Users_On"]);
Users us_end = us.Where(u => u.Id == (int)Session["Current_Id"]).FirstOrDefault();
us.Remove(us_end);
Application["Users_On"] = us;

顺便说一句 - 你的变量命名不是很好 - 选择更具描述性的名称。

内容简介:

List<Users> us = ((List<Users>)Application["Users_On"]);
Users us_end = us.First(x => x.ID == (int)Session["Current_Id"]);
us.Remove(us_end);
Application["Users_On"] = us;

通过在 remove 语句中找到项目而不是通过其他副本来就地删除它:

List<Users> us = ((List<Users>)Application["Users_On"]);
us.Remove(us.FirstOrDefault(u => u.ID == (int)Session["Current_Id"]));
Application["Users_On"] = us;

正如有人在前面的回答中所说:对象相等性是在 .NET 中通过引用进行比较的。但是,您可以通过简单地将 List 中的元素 T 从类转换为结构来从类和结构体之间的差异中受益。