从IEnumerable <t>中删除项目不起作用

时间:2015-05-27 08:13:12

标签: c# asp.net-mvc list ienumerable

我正在尝试从IEnumerable<ImportDataMappingModel> GridList

中删除对象

我尝试使用以下选项,但不使用它们。

valueImportDataMappingModel

中的属性
GridList.ToList().RemoveAll(o => o.value==null);
GridList=GridList.TakeWhile(o => o.value!=null);

5 个答案:

答案 0 :(得分:6)

试试这个:

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

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

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

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

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:4)

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

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);

修复方法是使用where:

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

答案 3 :(得分:2)

Remove您无法IEnumerable<T>项,因为它无法修改。

尝试使用ICollection<T>

答案 4 :(得分:1)

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

此代码无法执行您想要的操作,因为调用了&#39; .ToList()&#39;创建List&lt;&gt;的新实例,与GridList不同。因此,此代码实际上将从新列表实例中删除所有空值项,而不是从&#39; GridList&#39;。

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

这段代码实际上会按预期执行,但由于Linq命令的执行不同,只是调用TakeWhile()不会立即执行,而只是在您尝试读取GridList的项目之后。如果你想强制执行,你应该调用&#34; .ToList()&#34;或&#34;。ToArray()&#34;最后,即:

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