为什么我没有修改枚举集合时"收集被修改;枚举操作可能无法执行"?

Gra*_*ote 19 c# linq enumeration

我有两个字符串集合:CollectionA是存储在系统中的对象的StringCollection属性,而CollectionB是在运行时生成的List.如果存在任何差异,CollectionA需要更新以匹配CollectionB.所以我设计了我期望的一个简单的LINQ方法来执行删除.

var strDifferences = CollectionA.Where(foo => !CollectionB.Contains(foo));
foreach (var strVar in strDifferences) { CollectionA.Remove(strVar); }
Run Code Online (Sandbox Code Playgroud)

但我"Collection was modified; enumeration operation may not execute"在strDifferences上收到错误...即使它是一个与被修改的集合中的单独枚举!我最初明确地设计了这个来逃避这个错误,因为我的第一个实现会产生它(因为我在列举CollectionA并且只是删除时!CollectionB.Contains(str)).谁能解释为什么这个枚举失败了?

Mar*_*ers 27

这两者并非完全分开.Where不会单独复制该集合.它在内部保留对原始集合的引用,并在您请求时从中获取元素.

您可以通过添加ToList()强制Where来立即迭代集合来解决您的问题.

var strDifferences = CollectionA
    .Where(foo => !CollectionB.Contains(foo))
    .ToList();
Run Code Online (Sandbox Code Playgroud)

  • @GraceNote在这里抓住:http://stackoverflow.com/questions/1105990/is-it-better-to-call-tolist-or-toarray-in-linq-queries (2认同)