【问题标题】:Changing a Collection from within a loop从循环中更改集合
【发布时间】:2010-04-14 00:29:27
【问题描述】:

我有一个简单的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

虽然有点味道。

【问题讨论】:

    标签: .net vb.net


    【解决方案1】:

    您可以只迭代 一个键的副本,而不是迭代 KeyValuePairs。

    For Each K as String in mOptions.Keys.ToArray()
       Dim Val As Object = GetSomeOtherObjectBasedOnTheOption(K)
       mOptions(K) = Val
    Next
    

    (对不起,如果你不能把它粘贴进去——我通常不写 VB)

    它不一定是一个数组:例如,您也可以使用 VB 等效的 foreach (string k in new List<string>(mOptions.Keys))

    如果你遍历原始键并修改你的字典,你会得到同样的错误。

    【讨论】:

    • 我认为我这样做是错误的。我需要键 值,而不仅仅是键,但你的方法工作正常 - 我只是从循环顶部的原始集合中获取当前 val。
    【解决方案2】:

    为什么要迭代 KeyValuePairs?

    为什么不这样做?

    For Each K As String In mOptions.Keys.ToArray()
      Dim Val As Object = GetSomeOtherObjectBasedOnTheOption(K)
      mOptions(K) = Val
    Next
    

    这样,您迭代的集合是可用于访问字典的字符串列表,而不是字典本身。

    对于任何垃圾 VB 提前道歉。好几年没做过了

    【讨论】:

      【解决方案3】:

      在 C# 中这可以通过使用 yield 模式来完成,不知道在 VB.NET 中是否也可以,否则您可以创建一个允许它的自定义 IEnumerable...

      【讨论】:

      • 我投了反对票,因为这个答案的措辞可能具有误导性,并且侧重于 C# 而不是有效的 VB.NET 解决方案。如果您反过来说,意思会更清楚:“这可以通过实现自定义IEnumerable 来完成。为此目的使用yield(如果它在VB.NET 中可用)。 " (顺便说一句,yield 在 VB.NET 中不可用,至少在 VS 2008 中不可用。)——但是,我认为编写自定义迭代器可能会过大,因此是个坏主意。有更简单的解决方案。
      猜你喜欢
      • 2010-10-31
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      相关资源
      最近更新 更多