11

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

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;
4

6 回答 6

19

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

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

于 2012-06-10T18:24:26.973 回答
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);
}
于 2012-06-10T18:24:15.773 回答
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;

顺便说一句 - 您的变量命名不是很好 - 使用更具描述性的名称。

于 2012-06-10T18:22:50.910 回答
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;
于 2012-06-10T18:30:00.313 回答
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;
于 2015-08-14T08:05:33.917 回答
0

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

于 2019-08-09T16:00:58.587 回答