“List.Remove” in C# does not remove item?

后端 未结 6 652
面向向阳花
面向向阳花 2020-12-11 03:04

Hello how can i remove item from generic list here is my code im trying to do it right but i dont know where i make mistake;/

Users us_end = new Users();
for         


        
相关标签:
6条回答
  • 2020-12-11 03:08

    What's about:

    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;
    
    0 讨论(0)
  • 2020-12-11 03:08

    As someone said in the previous answers: object equality is compared by reference in .NET. But you can benefit from the difference between classes and structs by simply turning your element T inside List from class to struct.

    0 讨论(0)
  • 2020-12-11 03:11

    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);
    }
    
    0 讨论(0)
  • 2020-12-11 03:13

    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.

    0 讨论(0)
  • 2020-12-11 03:22

    Remove it in place by finding the item inside the remove statement, not via an additional copy:

    List<Users> us = ((List<Users>)Application["Users_On"]);
    us.Remove(us.FirstOrDefault(u => u.ID == (int)Session["Current_Id"]));
    Application["Users_On"] = us;
    
    0 讨论(0)
  • 2020-12-11 03:29

    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

    0 讨论(0)
提交回复
热议问题