web-dev-qa-db-fra.com

Supprimer un élément d'une collection IEnumerable <T>

J'ai un popuplated IEnumerable<User> collection.

Je veux supprimer un article, comment puis-je le faire?

foreach(var u in users)
{
  if(u.userId = 1123)
  {
    // remove!
  }
}

Je sais que vous ne devez pas supprimer en boucle, donc je ne crains pas de créer une nouvelle collection ou de la supprimer après.

Mais je ne sais pas comment enlever un objet, un peu perdu pour une raison quelconque!

Sinon, comment puis-je créer une nouvelle collection comme celle-ci:

IEnumerable<User> modifiedUsers = new List<User>();

foreach(var u in users)
{
   if(u.userId != 1233)
   {
        modifiedUsers.add ??????
   }
}

Comment puis-je ajouter à la collection?

43
loyalflow

Ne pas supprimer mais créer un nouveau List sans cet élément avec LINQ:

// remove
users = users.Where(u => u.userId != 123).ToList();

// new list
var modified = users.Where(u => u.userId == 123).ToList();
42
lante

Vous ne pouvez pas supprimer un élément d'un IEnumerable; il ne peut être énuméré que comme décrit ici: http://msdn.Microsoft.com/en-us/library/system.collections.ienumerable.aspx

Vous devez utiliser un ICollection si vous souhaitez ajouter et supprimer des éléments. Peut-être que vous pouvez essayer de lancer votre IEnumerable; Bien entendu, cela ne fonctionnera que si l'objet sous-jacent implémente ICollection`.

Voir ici pour plus d'informations sur ICollection: http://msdn.Microsoft.com/en-us/library/92t2ye13.aspx

Vous pouvez, bien sûr, simplement créer une nouvelle liste à partir de votre IEnumerable, comme indiqué par lante, mais cela peut être "sous optimal", selon votre cas d'utilisation réel, bien sûr.

ICollection est probablement la voie à suivre.

16
Willem D'Haeseleer

Essayez de transformer le IEnumerable en un List. À partir de ce moment, vous pourrez utiliser la méthode ListRemove pour supprimer des éléments.

Pour le transmettre en tant que paramètre à la méthode Remove à l'aide de Linq, vous pouvez obtenir l'élément à l'aide des méthodes suivantes:

  • users.Single(x => x.userId == 1123)
  • users.First(x => x.userId == 1123)

Le code est comme suit:

users = users.ToList(); // Get IEnumerable as List

users.Remove(users.First(x => x.userId == 1123)); // Remove item

// Finished
9
dutzu

Tu ne peux pas. IEnumerable<T> ne peut être qu'itéré.

Dans votre deuxième exemple, vous pouvez supprimer de la collection d'origine en itérant sur une copie de celle-ci.

foreach(var u in users.ToArray()) // ToArray creates a copy
{
   if(u.userId != 1233)
   {
        users.Remove(u);
   }
}
2
Tilak

Vous ne pouvez pas enlever IEnumerable<T> éléments, mais vous pouvez utiliser le méthode Enumerable.Skip

0
spajce

L’interface IEnumerable n’est que cela, énumérable - elle ne fournit aucune méthode pour Add ou Remove, ni même modifie la liste.

L'interface fournit simplement un moyen d'itérer sur certains éléments - la plupart des implémentations nécessitant une énumération implémenteront IEnumerable tel que List<T>

Pourquoi n'utilisez-vous pas votre code sans la conversion implicite vers IEnumerable

// Treat this like a list, not an enumerable
List<User> modifiedUsers = new List<User>();

foreach(var u in users)
{
   if(u.userId != 1233)
   {
        // Use List<T>.Add
        modifiedUsers.Add(u);
   }
}
0
Charleh