2011-06-29 172 views
4

我想使用lambda表达式从列表中删除某个对象,基于该对象内的值。这是我的λ:从列表中删除项目RemoveAll

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

这里是ChartAttributes列表

IList<IChartAttribute> ChartAttributes 

这里包含上面的列表

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

内的对象ChartAttribute有一种图表属性,其AttributeKey集到“PILOT”。但是这永远不会被删除。我究竟做错了什么?

感谢

+0

什么是'ChartAttributes'? – Gabe

回答

10

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

试试这个:

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

编辑

其实更好的办法,而无需调用ToList

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

您对.ToList()调用使一个新的列表,你最终从该列表中删除项目

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

基本上你这样做:

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

如果你在这一点上,以检查的newList内容你会发现,你的对象(S)已被删除,但ChartAttributes,任何类型的仍然存在这些物体。

您将不得不直接从ChartAttributes中删除对象,但由于您没有说出是哪种类型,我不能告诉你如何做到这一点。

1

如果您需要删除的项目,并保存到数据库中,你可以试试这个示例代码:

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

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

1

我有一个类似的问题,做了铸件代替(如我的属性setter是内部):

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