使用RemoveAll从列表中删除项目

时间:2011-06-29 15:24:47

标签: c# lambda

我正在尝试使用lambda表达式根据该对象中的值从列表中删除某个对象。这是我的lambda:

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

这是ChartAttributes列表

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 个答案:

答案 0 :(得分:12)

您的代码正在使用IEnumerable,将其所有元素复制到列表中,然后从该副本中删除项目。源IEnumerable未被修改。

试试这个:

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

修改

实际上是一种更好的方法,无需拨打ToList

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

答案 1 :(得分:10)

您对.ToList()的来电会生成新列表,最后您会从该列表中删除

无论ChartAttributes是什么,你都没有触及那些内容。

基本上你是这样做的:

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

如果您此时检查newList的内容,您会注意到您的对象已被删除,但ChartAttributes,无论何种类型,仍然存在这些对象。

您必须直接从ChartAttributes中删除对象,但由于您没有说出哪种类型,我无法举例说明如何执行此操作。

答案 2 :(得分:1)

如果您需要删除项目并保存到数据库,可以尝试以下示例代码:

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

它没有使用RemoveAll,但它是保存内容的另一种选择。

答案 3 :(得分:1)

我有一个类似的问题,并做了一个演员(因为我的属性的内置者是内部的):

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