以下代码将抛出运行时异常"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);
答案 0 :(得分:4)
答案 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();