繁体   English   中英

从IEnumerable中删除项目 <T> 不管用

[英]Remove items from the IEnumerable<T> is not working

我正在尝试从IEnumerable<ImportDataMappingModel> GridList删除对象

我尝试了以下选项,但没有一个在起作用。

valueImportDataMappingModel的属性

GridList.ToList().RemoveAll(o => o.value==null);
GridList=GridList.TakeWhile(o => o.value!=null);

尝试这个:

GridList = GridList.Where(o => o.value != null).ToList();

第一次尝试GridList.ToList().RemoveAll(o => o.value==null)创建列表的副本ToList()调用ToList() ),然后修改该副本,使原始列表保持不变。

您的第二次尝试GridList=GridList.TakeWhile(o => o.value!=null)创建一个可枚举,当枚举时将返回第一个空项目之前的所有非空项目(如果有)。 但是它实际上并未枚举新的枚举,因此您实际上从未创建过该新的集合。

要更正第二次尝试,您需要做两件事:

  1. 将TakeWhile替换为Where。 例如,如果您有一个包含三个条目的列表,其中第一个和第三个不为null,而第二个为null,则TakeWhile将仅返回第一项。 如果要使用所有非空项目,则需要使用Where。

  2. 调用ToList()以将Where枚举器选择的项目复制到新列表中。

ToList返回GridList的副本,并且您正在修改它,而不是原始的GridList

这不起作用,因为它正在处理副本,并且该副本未分配给任何对象。

GridList.ToList().RemoveAll(o => o.value==null);

解决方法是:

var list = GridList.ToList(); //create copy
list.RemoveAll(o => o.value==null); //work on copy
GridList = list; //assign copy to gridlist

这个TakeWhile版本不起作用,因为它将在o.value==null时停止o.value==null (请注意,如果不需要的内容都结束了,它将起作用):

GridList = GridList.TakeWhile(o => o.value!=null);

解决方法是在以下位置使用:

GridList = GridList.Where(o => o.value!=null);

您不能从IEnumerable<T> Remove项目,因为它不是可修改的。

尝试使用ICollection<T>

GridList.ToList().RemoveAll(o => o.value==null));

这段代码不会执行您想要的操作,因为对'.ToList()'的调用将创建一个与GridList不同的List <>的新实例。 因此,这段代码实际上将从新列表实例中删除所有空值项,而不是从“ GridList”中删除。

GridList = GridList.TakeWhile(o => o.value!=null);

这段代码实际上将执行您期望的操作,但是由于Linq命令的执行方式有所不同,因此仅在您尝试读取GridList的项目之后,仅调用TakeWhile()不会立即执行。 如果要强制执行,则应在结尾处调用“ .ToList()”或“ .ToArray()”,即:

GridList = GridList.TakeWhile(o => o.value!=null).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM