我有一个简单的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
操作异常无效
收集被修改;枚举操作可能无法执行。
我想我需要首先克隆字典然后遍历副本?这样做的最佳方式是什么?
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
虽然闻起来有些气味。
答案 0 :(得分:6)
您可以遍历密钥的副本,而不是遍历KeyValuePair
。
For Each K as String in mOptions.Keys.ToArray()
Dim Val As Object = GetSomeOtherObjectBasedOnTheOption(K)
mOptions(K) = Val
Next
(对不起,如果您不能将其粘贴到 - 我通常不会写VB)
它并不一定是一个数组:例如,你也可以使用等效于foreach (string k in new List<string>(mOptions.Keys))
的VB。
如果迭代原始密钥并修改字典,则会出现相同的错误。
答案 1 :(得分:0)
为什么迭代KeyValuePairs?
为什么不这样做?
For Each K As String In mOptions.Keys.ToArray()
Dim Val As Object = GetSomeOtherObjectBasedOnTheOption(K)
mOptions(K) = Val
Next
这样,迭代的集合是一个字符串列表,可用于访问字典,而不是字典本身。
预先为任何垃圾VB道歉。多年没有完成
答案 2 :(得分:-2)
在C#中这可以通过使用yield模式来完成,不知道它是否也可以在VB.NET中使用,否则你可以创建一个允许它的自定义IEnumerable ......