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

您好,我如何从通用列表中删除项目这里是我的代码我试图做对了但我不知道我哪里弄错了; /

Users us_end = new Users(); foreach (var VARIABLE in ((List)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 us = ((List)Application["Users_On"]); us.Remove(us_end); Application["Users_On"] = us; 

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

 Users us_end; foreach (var VARIABLE in ((List)Application["Users_On"])) { if(VARIABLE.Id == (int)Session["Current_Id"]) { us_end = (Users)VARIABLE; break; } } if (us_end != null) { List us = ((List)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 ,每个对象都inheritance自object.Equals )。 如果希望Remove方法找到对象,则无法传递新对象。

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

 var id = (int)Session["Current_Id"]; var list = (List)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"]已有的任何对象不同(它将具有不同的引用),因此不会被删除。

这假设在Users中未覆盖/实现Equals和/或IEquatable

 List us = ((List)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 us = ((List)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 us = ((List)Application["Users_On"]); us.Remove(us.FirstOrDefault(u => u.ID == (int)Session["Current_Id"])); Application["Users_On"] = us;