14 votes

"List.Remove" en C# ne supprime pas l'élément ?

Bonjour, comment supprimer un élément d'une liste générique ? Voici mon code, j'essaie de le faire correctement mais je ne sais pas où je fais une erreur;/

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;

19voto

rcdmk Points 6068

Vous devez obtenir le même objet à retirer, et non une copie.

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

Editer :

Juste pour clarifier une adresse ici, comme l'a indiqué pst, vous pourriez également mettre en œuvre la fonction IEquatable et quelques surcharges comme dans la réponse de Groo pour que cela fonctionne, mais je pense que c'est exagéré pour ce sujet spécifique. Il s'agit de la pratique la plus courante, mais il faut préciser qu'il est également possible de supprimer des éléments d'une liste, même s'il s'agit d'instances différentes ou même d'objets différents avec une technique de ce type.

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

11voto

Groo Points 19453

Par défaut, l'égalité des objets est comparée par référence dans .NET (à moins que Equals est surchargé, chaque objet hérite de object.Equals ). Si vous souhaitez que l Remove pour trouver votre objet, vous ne pouvez pas passer un nouvel objet.

La méthode la plus simple consiste à trouver le objet réel qui possède les propriétés souhaitées, puis le retirer :

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

6voto

Oded Points 271275

Vous créez un nouveau Users il ne s'agit pas d'un objet identique à un objet déjà présent dans la base de données Application["Users_On"] (il aura une référence différente), de sorte qu'il ne sera pas supprimé.

Cela suppose que Equals et/ou IEquatable<T> n'ont pas été surchargées/implémentées dans les 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;

Au fait, le nom de vos variables n'est pas très bon - optez pour des noms plus descriptifs.

0voto

Fuex Points 6246

De quoi s'agit-il ?

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;

0voto

Robert Points 53

Le supprimer à sa place en trouvant l'élément à l'intérieur de la déclaration de suppression, et non par le biais d'une copie supplémentaire :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X