Удаление элемента из списка с помощью RemoveAll - PullRequest
4 голосов
/ 29 июня 2011

Я пытаюсь использовать лямбда-выражение для удаления определенного объекта из списка на основе значения в этом объекте. Вот моя лямбда:

ChartAttributes.ToList().RemoveAll(a => a.AttributeValue.Contains("PILOT"));

Вот список атрибутов Chart

IList<IChartAttribute> ChartAttributes 

Вот объект ChartAttribute, содержащийся в приведенном выше списке

    public virtual string AttributeKey { get; set; }       
    public virtual string AttributeValue { get; set; }        
    public virtual int ChartAttributeId { get; set; }        
    public virtual int ChartSpecificationId { get; set; }

Существует атрибут диаграммы с атрибутом AttributeKey, установленным на «PILOT». Но это никогда не удаляется. Что я делаю не так?

Спасибо

Ответы [ 4 ]

12 голосов
/ 29 июня 2011

Ваш код принимает IEnumerable, копирует все его элементы в список и затем удаляет элементы из этой копии. Источник IEnumerable не изменен.

Попробуйте это:

var list =  ChartAttributes.ToList();
list.RemoveAll(a => a.AttributeValue.Contains("PILOT"));
ChartAttributes = list;

EDIT

На самом деле лучше, без необходимости звонить ToList:

ChartAttributes = ChartAttributes.Where(a => !a.AttributeValue.Contains("PILOT"));
10 голосов
/ 29 июня 2011

Ваш звонок на .ToList() создает новый список , и в итоге вы удаляете элемент из этого списка .

Что бы вы ни называли ChartAttributes, вывы не касаетесь его содержимого.

По сути, вы делаете это:

var newList = ChartAttributes.ToList();
newList.RemoveAll(...);

Если бы вы проверяли содержимое newList на этом этапе, вы заметили бы, чтоВаш объект (ы) был удален, но ChartAttributes, независимо от типа, все еще содержит эти объекты.

Вам придется удалять объекты непосредственно из ChartAttributes, но так как вы не сказали, какой тип этоЯ не могу дать вам пример того, как это сделать.

1 голос
/ 02 ноября 2015

У меня была похожая проблема, и вместо этого я произвел приведение (поскольку мой установщик свойства был внутренним):

((List<IChartAttribute>)ChartAttributes).RemoveAll(a => a.AttributeValue.Contains("PILOT"));
1 голос
/ 08 июля 2014

Если вам нужно удалить элементы и сохранить в базе данных, вы можете попробовать этот пример кода:

foreach (var x in db.myEntities.Where(a => a.AttributeValue.Contains("PILOT")))
  db.myEntities.Remove(x);
db.SaveChanges();

Он не использует RemoveAll, но это еще один вариант сохранения содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...