web-dev-qa-db-fra.com

Comment supprimer un élément de la liste en C #?

J'ai une liste stockée dans resultlist comme suit:

var resultlist = results.ToList();

Cela ressemble à quelque chose comme ça:

ID FirstName  LastName
-- ---------  --------
1  Bill       Smith
2  John       Wilson
3  Doug       Berg

Comment puis-je supprimer l'ID 2 de la liste?

152
Nate Pet

List<T> a deux méthodes que vous pouvez utiliser.

RemoveAt (int index) peut être utilisé si vous connaissez l'index de l'élément. Par exemple:

resultlist.RemoveAt(1);

Ou vous pouvez utiliser Remove (T item) :

var itemToRemove = resultlist.Single(r => r.Id == 2);
resultList.Remove(itemToRemove);

Lorsque vous n'êtes pas sûr que l'élément existe vraiment, vous pouvez utiliser SingleOrDefault . SingleOrDefault retournera null s'il n'y a pas d'élément (Single lève une exception lorsqu'il ne peut pas trouver l'élément). Les deux jetteront quand il y a une valeur en double (deux éléments avec le même id).

var itemToRemove = resultlist.SingleOrDefault(r => r.Id == 2);
if (itemToRemove != null)
    resultList.Remove(itemToRemove);
304
Wouter de Kort
resultList = results.Where(x=>x.Id != 2).ToList();

Il y a un petit assistant Linq que j'aime bien, qui est facile à mettre en œuvre et permet d'effectuer des requêtes avec des conditions "où non" un peu plus lisibles:

public static IEnumerable<T> ExceptWhere<T>(this IEnumerable<T> source, Predicate<T> predicate)
{
    return source.Where(x=>!predicate(x));
}

//usage in above situation
resultList = results.ExceptWhere(x=>x.Id == 2).ToList();
39
KeithS

Réponse courte:
Supprimer (de la liste results)

results.RemoveAll(r => r.ID == 2); enlèvera l'élément avec ID 2 dans results (en place).

Filtre (sans retirer de la liste d'origine results):

var filtered = result.Where(f => f.ID != 2); retourne tous les articles sauf celui avec ID 2

Réponse détaillée:

Je pense que .RemoveAll() est très flexible, car vous pouvez avoir une liste d’ID d’éléments que vous souhaitez supprimer - veuillez considérer l’exemple suivant.

Si tu as:

class myClass {
    public int ID; public string FirstName; public string LastName;
}

et assigné des valeurs à results comme suit:

var results=new List<myClass> {
    new myClass()  { ID=1, FirstName="Bill", LastName="Smith" },
    new myClass()  { ID=2, FirstName="John", LastName="Wilson" },
    new myClass()  { ID=3, FirstName="Doug", LastName="Berg" },
    new myClass()  { ID=4, FirstName="Bill", LastName="Wilson" },
};

Ensuite, vous pouvez définir une liste d’ID à supprimer:

var removeList = new List<int>() { 2, 3 };

Et utilisez simplement ceci pour les supprimer:

results.RemoveAll(r => removeList.Any(a => a==r.ID));

Cela supprimera les éléments 2 et 3 et conservera les éléments 1 et 4 - comme spécifié par le removeList. Notez que cela se produit à la place, aucune affectation supplémentaire n'est donc requise.

Bien sûr, vous pouvez également l'utiliser sur des éléments uniques tels que:

results.RemoveAll(r => r.ID==4);

où il va supprimer Bill avec ID 4 dans notre exemple.


DotNetFiddle: Lancer la démo

30
Matt

Il y a une autre approche. Il utilise List.FindIndex et _List.RemoveAt_.

Bien que j'utiliserais probablement la solution présentée par KeithS (juste le simple Where/ToList), cette approche diffère en ce qu'elle mute l'objet de liste d'origine. Cela peut être une bonne (ou une mauvaise) "fonctionnalité" en fonction des attentes.

Dans tous les cas, la FindIndex (couplée à une protection) garantit que la RemoveAt sera correcte s’il existe des espaces dans les ID ou si la commande est fausse, etc., et si vous utilisez RemoveAt (vs Remove) évite une seconde O(n) recherche dans la liste.

Voici un LINQPad extrait:

_var list = new List<int> { 1, 3, 2 };
var index = list.FindIndex(i => i == 2); // like Where/Single
if (index >= 0) {   // ensure item found
    list.RemoveAt(index);
}
list.Dump();        // results -> 1, 3
_

Bonne codage.

5
user166390

Plus simplifié:

resultList.Remove(resultList.Single(x => x.Id == 2));

il n'est pas nécessaire de créer un nouvel objet var.

Vous ne spécifiez pas quel type de liste, mais la liste générique peut utiliser la méthode RemoveAt(index) ou la méthode Remove(obj):

// Remove(obj)
var item = resultList.Single(x => x.Id == 2);
resultList.Remove(item);

// RemoveAt(index)
resultList.RemoveAt(1);
3
mgnoonan

... ou simplement resultlist.RemoveAt(1) si vous connaissez exactement l'index.

0
Vlad
{
    class Program
    {
        public static List<Product> list;
        static void Main(string[] args)
        {

            list = new List<Product>() { new Product() { ProductId=1, Name="Nike 12N0",Brand="Nike",Price=12000,Quantity=50},
                 new Product() { ProductId =2, Name = "Puma 560K", Brand = "Puma", Price = 120000, Quantity = 55 },
                 new Product() { ProductId=3, Name="WoodLand V2",Brand="WoodLand",Price=21020,Quantity=25},
                 new Product() { ProductId=4, Name="Adidas S52",Brand="Adidas",Price=20000,Quantity=35},
                 new Product() { ProductId=5, Name="Rebook SPEED2O",Brand="Rebook",Price=1200,Quantity=15}};


            Console.WriteLine("Enter ProductID to remove");
            int uno = Convert.ToInt32(Console.ReadLine());
            var itemToRemove = list.Find(r => r.ProductId == uno);
            if (itemToRemove != null)
                list.Remove(itemToRemove);
            Console.WriteLine($"{itemToRemove.ProductId}{itemToRemove.Name}{itemToRemove.Brand}{itemToRemove.Price}{ itemToRemove.Quantity}");
            Console.WriteLine("------------sucessfully Removed---------------");

            var query2 = from x in list select x;
            foreach (var item in query2)
            {
                /*Console.WriteLine(item.ProductId+" "+item.Name+" "+item.Brand+" "+item.Price+" "+item.Quantity );*/
                Console.WriteLine($"{item.ProductId}{item.Name}{item.Brand}{item.Price}{ item.Quantity}");
            }

        }

    }
}
0
Prabhakaran M