"Список.Удалить " в C# не удаляет элемент?

Привет, как я могу удалить элемент из общего списка вот мой код im пытается сделать это правильно, но я не знаю, где я ошибаюсь;/

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;

5 ответов


вы должны получить тот же объект для удаления, а не копию.

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:

просто чтобы уточнить адрес здесь, как указал pst, вы также можете реализовать IEquatable интерфейс и некоторые переопределения, такие как ответ Groo, чтобы заставить его работать, но я думаю, что это перебор по этому конкретному вопросу. Давая это как наиболее распространенную практику, но давая понять, что также можно удалить элементы из списка, даже если они являются различными экземплярами или даже различные объекты с такой техникой.

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


по умолчанию равенство объектов сравнивается по ссылке в .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);
}

вы создаете новая Users object-это не то же самое, что любой объект уже в 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;

кстати - ваше именование переменных не очень хорошо-перейдите к более описательным именам.


о чем:

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;

удалите его на месте, найдя элемент внутри инструкции remove, а не с помощью дополнительной копии:

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