使用RemoveAll从列表中删除项目

hoa*_*key 5 c# lambda

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

ChartAttributes.ToList().RemoveAll(a => a.AttributeValue.Contains("PILOT"));
Run Code Online (Sandbox Code Playgroud)

这是ChartAttributes列表

IList<IChartAttribute> ChartAttributes 
Run Code Online (Sandbox Code Playgroud)

这是上面列表中包含的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; }
Run Code Online (Sandbox Code Playgroud)

有一个图表属性,其AttributeKey设置为"PILOT".但这永远不会被删除.我究竟做错了什么?

谢谢

dka*_*man 12

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

试试这个:

var list =  ChartAttributes.ToList();
list.RemoveAll(a => a.AttributeValue.Contains("PILOT"));
ChartAttributes = list;
Run Code Online (Sandbox Code Playgroud)

编辑

实际上是一种更好的方式,无需致电ToList:

ChartAttributes = ChartAttributes.Where(a => !a.AttributeValue.Contains("PILOT"));
Run Code Online (Sandbox Code Playgroud)


ang*_*son 10

您打电话来.ToList()制作新列表,最后从该列表中删除该项目.

不管ChartAttributes是什么,你都没有触及那些内容.

基本上你是这样做的:

var newList = ChartAttributes.ToList();
newList.RemoveAll(...);
Run Code Online (Sandbox Code Playgroud)

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

您必须直接从ChartAttributes中删除对象,但由于您没有说出哪种类型,我不能给您一个如何做到这一点的示例.