C# 使用RemoveAll从列表中删除项

C# 使用RemoveAll从列表中删除项,c#,lambda,C#,Lambda,我试图使用lambda表达式根据某个对象中的值从列表中删除该对象。这是我的lambda: ChartAttributes.ToList().RemoveAll(a => a.AttributeValue.Contains("PILOT")); 这是图表属性列表 IList<IChartAttribute> ChartAttributes 有一个图表属性,其AttributeKey设置为“PILOT”。但这永远不会被移除。我做错了什么 感谢您对.ToList()的调用创建了

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

ChartAttributes.ToList().RemoveAll(a => a.AttributeValue.Contains("PILOT"));
这是图表属性列表

IList<IChartAttribute> ChartAttributes 
有一个图表属性,其AttributeKey设置为“PILOT”。但这永远不会被移除。我做错了什么

感谢您对
.ToList()
的调用创建了一个新列表,您最终将从该列表中删除该项目

无论
ChartAttributes
是什么,您都不会触及它的内容

基本上你是这样做的:

var newList = ChartAttributes.ToList();
newList.RemoveAll(...);
如果此时要检查
newList
的内容,您会注意到您的对象已被删除,但ChartAttributes(无论是什么类型)仍然存在这些对象


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

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

试试这个:

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

实际上是一种更好的方法,无需调用
ToList

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

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

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

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

我遇到了类似的问题,并进行了强制转换(因为我的属性设置程序是内部的):

((列表)ChartAttributes).RemoveAll(a=>a.AttributeValue.Contains(“PILOT”);
foreach (var x in db.myEntities.Where(a => a.AttributeValue.Contains("PILOT")))
  db.myEntities.Remove(x);
db.SaveChanges();
((List<IChartAttribute>)ChartAttributes).RemoveAll(a => a.AttributeValue.Contains("PILOT"));