从循环内更改集合

时间:2010-04-13 16:17:24

标签: .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

操作异常无效
收集被修改;枚举操作可能无法执行。

我想我需要首先克隆字典然后遍历副本?这样做的最佳方式是什么?

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

虽然闻起来有些气味。

3 个答案:

答案 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 ......