15

If i have

IEnumberable<Car> list

and i want to remove an item from this list based on a property of the car

i want something like:

list.RemoveWhere(r=>r.Year > 2000)

does something like this exist ?

i am doing this over and over so i want to avoid copying the list each time to just remove one item

leora
  • 188,729
  • 360
  • 878
  • 1,366

3 Answers3

19

Very late to the party but for any one would comes across this problem, here is a cleaner solution:

MyList.RemoveAll( p => p.MyProperty == MyValue );
TheSoul
  • 4,906
  • 13
  • 44
  • 74
  • This is a good solution, but IEnumerable does not have this method. You will have to first ensure the collection is a List type. – Takahashinator Jan 09 '20 at 18:45
17

IEnumberable is immutable, but you can do something like this:

list = list.Where(r=>r.Year<=2000)

or write an extension method:

public static IEnumerable<T> RemoveWhere<T>(this IEnumerable<T> query, Predicate<T> predicate)
{ 
    return query.Where(e => !predicate(e));
}
Andry
  • 16,172
  • 27
  • 138
  • 246
sloth
  • 99,095
  • 21
  • 171
  • 219
  • @ooo IEnumerable is immutable, so you can't simple add or remove items, it's impossible. Of course you could just use a List, but it is not possible to say if this would be faster. If you do this over and over, keep the deferred execution in mind. – sloth Jul 24 '10 at 14:32
4

If you are working with IEnumerable<T>, how about Where?

list = list.Where(car => car.Year <= 2000);

If you are working with ICollection<T> and you not just get a filtered result but really intend to manipulate the source collection, you can create an own tailor made extension for collection:

  public static class CollectionExtensions {
     public static ICollection<T> RemoveWhere<T>(this ICollection<T> collection, Func<T, bool> predicate) {
        List<T> toRemove = collection.Where(item => predicate(item)).ToList();
        toRemove.ForEach(item => collection.Remove(item));
        return collection;
     }
  }
Florian Reischl
  • 3,788
  • 1
  • 24
  • 19