Удаление элемента из списка с помощью RemoveAll

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

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

Вот список ChartAttributes

IList<ichartattribute> ChartAttributes 
</ichartattribute>

Вот объект 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; }

Имеется атрибут chart с его атрибутом AttributeKey, установленным в "PILOT". Но это никогда не удаляется. Что я делаю неправильно?

Спасибо

4 ответа

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

Попробуйте следующее:

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

ИЗМЕНИТЬ

На самом деле лучший способ, без вызова ToList:

ChartAttributes = ChartAttributes.Where(a => !a.AttributeValue.Contains("PILOT"));


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

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

В основном вы делаете это:

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

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

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


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

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

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


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

((List<ichartattribute>)ChartAttributes).RemoveAll(a => a.AttributeValue.Contains("PILOT"));
</ichartattribute>

licensed under cc by-sa 3.0 with attribution.