"List.Remove" in C# does not remove item?

You have to get the same object to remove, not a copy.

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

Edit:

Just to clarify an address here, as pst pointed, you could also implement the IEquatable interface and some overridings like on the Groo's answer to make it work, but i think it's overkill on this specific subject. Giving this as the most common practice, but making clear that it's also possible to remove items from a list, even if they are diferent instances or even diferent objects with a technique like that.

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


By default, object equality is compared by reference in .NET (unless Equals is overriden, every object inherits from object.Equals). If you want the Remove method to find your object, you cannot pass a new object.

The simplest way would be to find the actual object which has desired properties, and then remove it:

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);
}

You are creating a new Users object - this is not the same as any object already in Application["Users_On"] (it will have a different reference), so it will not be removed.

This assumes that Equals and/or IEquatable<T> were not overridden/implemented in 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;

By the way - your variable naming is not very good - go for more descriptive names.

Tags:

C#

Asp.Net