Linq удаляет элемент из массива объектов, где свойство равно значению

Если у меня есть

IEnumberable<Car> list

и я хочу удалить элемент из этого списка на основе свойства автомобиля

Мне нужно что-то вроде:

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

существует ли что-то подобное?

Я делаю это снова и снова, поэтому я хочу избежать копирования списка каждый раз, чтобы просто удалить один элемент

Ответ 1

IEnumberable является неизменным, но вы можете сделать что-то вроде этого:

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

или напишите метод расширения:

public static IEnumerable<T> RemoveWhere<T>(this IEnumerable<T> query, Predicate<T> predicate)
{ 
    return query.Where(e => !predicate(e));
}

Ответ 2

Очень поздно для вечеринки, но для кого-то это столкнется, вот более чистое решение:

MyList.RemoveAll( p => p.MyProperty == MyValue );

Ответ 3

Если вы работаете с IEnumerable<T>, как насчет Where?

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

Если вы работаете с ICollection<T>, и вы не просто получаете отфильтрованный результат, но действительно собираетесь манипулировать исходной коллекцией, вы можете создать собственное портфолио для коллекции:

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