从循环内更改集合

Cyl*_*ric 0 .net vb.net

我有一个简单的Dictionary(of String, Object),我需要迭代并根据某些条件更改项目.

由于我无法修改我正在迭代的集合,我该如何实现?

例如,以下显然会导致Invalid Operation Exception:

Dim mOptions As New Dictionary(of String, Object)
mOptions.Add("optA", "A")
mOptions.Add("optB", "B")
mOptions.Add("optC", "C")

For Each O As KeyValuePair(Of String, Object) In mOptions
    Dim Val As Object = GetSomeOtherObjectBasedOnTheOption(O.Key, O.Value)
    mOptions(O.Key) = Val
Next
Run Code Online (Sandbox Code Playgroud)


修改了无效的操作异常集合; 枚举操作可能无法执行.

我想我需要首先克隆字典并迭代副本?这样做的最佳方法是什么?

Dim TempOptions As New Dictionary(of String, Object)
For Each O As KeyValuePair(Of String, Object) In mOptions
    TempOptions.Add(O.Key, O.Value)
Next

For Each O As KeyValuePair(Of String, Object) In TempOptions
    Dim Val As Object = GetSomeOtherObjectBasedOnTheOption(O.Key, O.Value)
    mOptions(O.Key) = Val
Next
Run Code Online (Sandbox Code Playgroud)

虽然闻起来有点味道.

Mar*_*off 6

您可以迭代密钥的副本而不是迭代KeyValuePairs.

For Each K as String in mOptions.Keys.ToArray()
   Dim Val As Object = GetSomeOtherObjectBasedOnTheOption(K)
   mOptions(K) = Val
Next
Run Code Online (Sandbox Code Playgroud)

(对不起,如果你不能只是粘贴它 - 我通常不写VB)

它并不一定是一个数组:例如,你可以做VB的等价物foreach (string k in new List<string>(mOptions.Keys)).

如果迭代原始密钥并修改字典,则会出现相同的错误.