[英]Removing item from list with RemoveAll
我正在尝试使用 lambda 表达式根据 object 中的值从列表中删除某个 object。 这是我的 lambda:
ChartAttributes.ToList().RemoveAll(a => a.AttributeValue.Contains("PILOT"));
这是 ChartAttributes 列表
IList<IChartAttribute> ChartAttributes
这是上面列表中包含的 object 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”。 但这永远不会被删除。 我究竟做错了什么?
谢谢
您的代码采用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.myEntities.Where(a => a.AttributeValue.Contains("PILOT")))
db.myEntities.Remove(x);
db.SaveChanges();
它不使用 RemoveAll,但它是另一种保存内容的选项。
我有一个类似的问题,而是做了一个演员(因为我的属性设置器是内部的):
((List<IChartAttribute>)ChartAttributes).RemoveAll(a => a.AttributeValue.Contains("PILOT"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.