从IEnumerable<;T>;不起作用

本文关键字:不起作用 gt lt IEnumerable | 更新日期: 2023-09-27 17:50:49

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

我尝试了以下选项,但没有一个有效。

valueImportDataMappingModel 中的一个性质

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

从IEnumerable<;T>;不起作用

试试这个:

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

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

您的第二次尝试GridList=GridList.TakeWhile(o => o.value!=null)创建了一个枚举对象,该枚举对象在枚举时将返回第一个null项(如果有的话(之前的所有非null项。但它实际上并没有枚举新的可枚举对象,因此您永远不会创建新的集合。

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

  1. 将TakeWhile替换为Where。例如,如果您有一个包含三个条目的列表,其中第一个和第三个条目不为null,而第二个条目为null,则TakeWhile将只返回第一个条目。如果想要所有非null项,则需要使用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时它将停止拍摄,(注意,在你不想要的一切都结束的情况下它会起作用!(:

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(("的调用会创建List<>的新实例,因此此代码无法执行您想要的操作,不同于GridList。因此,此代码实际上将从新列表实例中删除所有空值项,而不是从"GridList"中删除。

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

这段代码实际上会做你期望的事情,但由于Linq命令在执行时不同,简单地调用TakeWhile((不会立即执行,而是只有在你尝试读取GridList的项之后。如果你想强制执行,你应该在最后调用".ToList(("或".ToArray((",即:

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