【发布时间】:2010-12-15 19:56:57
【问题描述】:
我对这里的 F# 很陌生,我在 F# 中遇到了“Collection was modified”的问题。我知道当我们在迭代集合的同时修改(添加/删除)它时,这个问题很常见。而stackoverflow中之前的线程也指向了这一点。
但就我而言,我正在研究 2 个不同的集合: 我有 2 个收藏:
- originalCollection 我要从中删除内容的原始集合
- colToRemove 包含我要删除的对象的集合
下面是代码:
Seq.iter ( fun input -> ignore <| originalCollection.Remove(input)) colToRemove
我收到以下运行时错误:
+ $exception {System.InvalidOperationException:集合已修改;枚举操作可能无法执行。
在 System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource 资源)
在 System.Collections.Generic.List1.Enumerator.MoveNextRare()
at System.Collections.Generic.List1.Enumerator.MoveNext()
在 Microsoft.FSharp.Collections.IEnumerator.next@174[T](FSharpFunc2 f, IEnumerator1 e,FSharpRef1 started, Unit unitVar0)
at Microsoft.FSharp.Collections.IEnumerator.filter@169.System-Collections-IEnumerator-MoveNext()
at Microsoft.FSharp.Collections.SeqModule.Iterate[T](FSharpFunc2 操作,IEnumerable`1 源)
这是代码块:
match newCollection with
| Some(newCollection) ->
// compare newCollection to originalCollection.
// If there are things that exist in the originalCollection that are not in the newCollection, we want to remove them
let colToRemove = Seq.filter (fun input -> Seq.exists (fun i -> i.id = input.id) newCollection) originalCollection
Seq.iter ( fun input -> ignore <| originalCollection.Remove(input)) colToRemove
| None -> ()
谢谢!
注意:这里是在单线程环境下工作,因此不存在可能导致此异常的多线程问题。
【问题讨论】:
标签: f#