asp.net C#中的“List.Remove”不删除项?

cbwuti44  于 12个月前  发布在  .NET
关注(0)|答案(6)|浏览(106)

你好,我怎么能从通用列表中删除项目,这是我的代码,我试图这样做的权利,但我不知道我犯了错误;/

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;

字符串

6mzjoqzu

6mzjoqzu1#

你必须得到相同的对象删除,而不是一个副本。

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

wnvonmuf

wnvonmuf2#

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

字符串

ebdffaop

ebdffaop3#

您正在创建一个 newUsers对象-这与Application["Users_On"]中已有的任何对象都不相同(它将具有不同的引用),因此它不会被删除。
这假设Users中没有覆盖/实现Equals和/或IEquatable<T>

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;

字符串
顺便说一下-你的变量命名不是很好-去更多的描述性名称。

carvr3hs

carvr3hs4#

关于:

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;

字符串

q5lcpyga

q5lcpyga5#

通过在remove语句中找到项目来删除它,而不是通过额外的副本:

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

字符串

uyto3xhc

uyto3xhc6#

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

相关问题