当前位置: 首页 > 编程语言 > C#

为什么我在不修改枚举集合的情况下得到“集合被修改;可能无法执行枚举操作”?分享

时间:2023-04-11 02:25:11 C#

为什么我在不修改枚举集合的情况下得到“集合被修改;枚举操作可能无法执行”?我有两个字符串集合:CollectionA是系统中存储的对象的StringCollection属性,CollectionB是运行时生成的列表。如果存在任何差异,则需要更新CollectionA以匹配CollectionB。所以我设计了一个我期望的简单LINQ方法来执行删除。varstrDifferences=CollectionA.Where(foo=>!CollectionB.Contains(foo));foreach(strDifferences中的varstrVar){CollectionA.Remove(strVar);但我得到一个“集合被修改;枚举操作可能无法执行”错误的strDifferences......即使它是一个单一的可枚举修改集合!我最初明确设计这个是为了避免这个错误,因为我的第一个实现会产生它(因为我在CollectionA中枚举并且刚刚删除了!CollectionB.Contains(str))。谁能解释为什么这个枚举失败了?两者并不是完全分开的。哪里没有单独的收藏副本。它在内部保留对原始集合的引用,并在您请求时从中获取元素。您可以通过添加ToList()强制立即迭代集合来解决您的问题。varstrDifferences=CollectionA.Where(foo=>!CollectionB.Contains(foo)).ToList();尝试稍微修改第一行:varstrDifferences=CollectionA.Where(foo=>!CollectionB.Contains(foo)).ToList();我认为LINQ正在延迟执行您的查询。调用ToList将强制在枚举之前执行查询。传回IEnumerable,然后在foreach(strDifferences中的varstrVar)中使用它您尚未创建新列表,它引用CollectionA以从中提取下一项,因此您无法编辑CollectionA。您也可以这样做:varstrDifferences=CollectionA.Where(foo=>CollectionB.Contains(foo)).ToList();CollectionA=海峡差异;//或者不是重新分配CollectionACollectionA.Clear();CollectionA.AddRange(strDifferences);因为您要删除那些不在CollectionB中的。只需查找那些,创建一个列表并将该列表分配给CollectionA变量。以上是C#学习教程:为什么我得到“collectionsaremodified;enumerationoperationsmaynotbeperformed”没有修改枚举的集合?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: