101 votes

Retirer un élément de la liste en fonction d'une condition

J'ai une structure comme celle-ci :

public struct stuff
{
    public int ID;
    public int quan;
}

et je veux retirer le produit où ID est de 1.
Je suis en train d'essayer ça :

prods.Remove(new stuff{ prodID = 1});

et ça ne marche pas.

MERCI À TOUS

259voto

Noldorin Points 67794

Si votre type de collection est un List<stuff> alors la meilleure approche est probablement la suivante :

prods.RemoveAll(s => s.ID == 1)

Cette méthode ne fait qu'un seul passage (itération) sur la liste, et devrait donc être plus efficace que les autres méthodes.

Si votre type est plus génériquement un ICollection<T> Si l'on se soucie des performances, il peut être utile d'écrire une méthode d'extension courte. Si ce n'est pas le cas, vous pouvez probablement vous en sortir en utilisant LINQ (en appelant la méthode Where ou Single ).

81voto

tanascius Points 22712

Utilisation de linq :

prods.Remove( prods.Single( s => s.ID == 1 ) );

Peut-être que vous voulez même utiliser SingleOrDefault() et vérifier si l'élément existe vraiment ...

EDITAR:
Depuis stuff est une structure, SingleOrDefault() ne retournera pas null. Mais il retournera default( stuff ) qui aura un ID de 0. Si vous n'avez pas un ID de 0 pour votre normal les objets que vous pouvez interroger pour cet identifiant :

var stuffToRemove = prods.SingleOrDefault( s => s.ID == 1 );
if( stuffToRemove.ID != 0 )
{
    prods.Remove( stuffToRemove );
}

9voto

Nathan W Points 19990

Si vous avez LINQ :

var itemtoremove = prods.Where(item => item.ID == 1).First();
prods.Remove(itemtoremove)

3voto

Jordan Points 101
prods.Remove(prods.Find(x => x.ID == 1));

2voto

Just Shadow Points 2077

Voici une solution pour ceux qui veulent l'enlever de l'ordinateur. base de données avec Entity Framework :

prods.RemoveWhere(s => s.ID == 1);

Et la méthode d'extension elle-même :

using System;
using System.Linq;
using System.Linq.Expressions;
using Microsoft.EntityFrameworkCore;

namespace LivaNova.NGPDM.Client.Services.Data.Extensions
{
    public static class DbSetExtensions
    {
        public static void RemoveWhere<TEntity>(this DbSet<TEntity> entities, Expression<Func<TEntity, bool>> predicate) where TEntity : class
        {
            var records = entities
                .Where(predicate)
                .ToList();
            if (records.Count > 0)
                entities.RemoveRange(records);
        }
    }
}

P.S. Ceci simule la méthode RemoveAll() qui n'est pas disponible pour les ensembles DB du cadre des entités.

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