如何使用LINQ删除具有特定条件的列表子集?

时间:2011-12-19 02:00:00

标签: c# linq

以下代码将抛出运行时异常"Collection was modified; enumeration operation may not execute."

List<string> l = new List<string>();
l.Add("a");
l.Add("b");
l.Add("c");
foreach (string s in l.Where(s => s.CompareTo("a")>0))
    l.Remove(s);

4 个答案:

答案 0 :(得分:4)

在枚举时,您无法从集合中删除项目。

在这种情况下,我会使用List<T>.RemoveAll

l.RemoveAll(s => s.CompareTo("a")>0);

答案 1 :(得分:2)

你需要考虑按某种条件过滤它意味着什么,然后用某种条件去除它意味着什么。 (提示:他们是合乎逻辑的对立面。)你正在做的是一种更为复杂的陈述方式:

var result = l.Where(s => ! (s.CompareTo("a")>0));

答案 2 :(得分:1)

最简单的方法是在linq查询后执行ToList。像

这样的东西
List<string> l = new List<string>();
l.Add("a");
l.Add("b");
l.Add("c");
l = l.Where(s => s.CompareTo("b") > 0).ToList();

l最终只会包含c

同样提及Jon列表也有RemoveAll方法,您可以使用

l.RemoveAll(s => s.CompareTo("b") <= 0);

做同样的事情,但注意逻辑已翻转,但技术上你没有使用linq

答案 3 :(得分:1)

通常,您无法在foreach循环中删除或添加集合。只需设置where子句即可返回您要查找的结果。

List<string> l = new List<string>();
l.Add("a");
l.Add("b");
l.Add("c");

// notice that the where clause is opposite of what you had before
l = list.Where( s=> s.CompareTo("a") <= 0 ).ToList();