我正在尝试使用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”。但这永远不会被删除。我做错了什么?
由于
答案 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"));