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

时间:2012-06-10 18:19:49

标签: c# asp.net

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

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;

6 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:9)

默认情况下,在.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);
}

答案 2 :(得分:6)

您正在创建 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;

顺便说一下 - 你的变量命名不是很好 - 去寻找更具描述性的名字。

答案 3 :(得分:0)

关于:

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;

答案 4 :(得分:0)

通过查找remove语句中的项目而不是通过其他副本来删除它:

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

答案 5 :(得分:0)

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