仅当值也是可枚举或自定义时,字典才为每个键返回相同的值

Dictionary returning same value for every key only when value is also an enumerable or custom

我是菜鸟,所以请记住这个问题。这是一段非常简单的代码:

Sub main()
{
Dim m_Dictionary as new Dictionary(Of Integer, List(Of String))
Dim workingList as new List(Of String)
Dim workingKey as Integer
Dim keyStash as List(Of Integer)
Dim workingDict as new Dictionary(Of Integer, String)

For i=0 to 9
    Do
      workingKey = RandomInteger()
    Loop While workingList.ContainsKey(workingKey)

    For n=0 to 4
      workingList.Add(RandomString())
    Next
    keyStash.Add(workingKey)
    workingDict.Add(workingKey, workingList)

 Next
 ' now I just want to play back the generators of random data

 For each Key As Integer in keyStash

    For each Entry as String in workingDict(Key).Value

           Line(Entry)

     Next

   Next

我没有像预期的那样很好地播放所有内容,而是留下了完全准确的字典键。但是,每个列表实例中的字符串值对于每个键都是相同的。这些值等于随机数据生成的最后一个循环中的值。因此,它不会回放 50 个唯一条目,而是写出最后一个循环的 9 次。我看了看里面——一切看起来都很好。得到这个。所有列表、集合、哈希表、所有迭代类型以及自定义类型都证明了这种行为。我找到了解决方案,但它没有解释任何内容。请任何人帮忙解释一下!??

保存RandomString生成的字符串的变量是在循环外创建的。在该循环中,您将不断地向同一个实例添加新字符串,并将相同的列表实例添加到每个新的整数键。在循环结束时,添加的每个整数键都有其值指向列表的相同引用。当然他们是一样的....

您的代码的第一个修复可能是

Dim m_Dictionary as new Dictionary(Of Integer, List(Of String))
Dim workingKey as Integer

For i=0 to 9

    ' Internal to the loop. so at each loop you get a new list
    ' to use for the specific key generated in the current loop
    Dim workingList as new List(Of String)

    Do
        workingKey = RandomInteger()
    Loop While m_Dictionary.ContainsKey(workingKey)

    For n=0 to 4
        workingList.Add(RandomString())
    Next
    m_Dictionary.Add(workingKey, workingList)
Next 
For each k in m_Dictionary 
    For each Entry in k.Value
        ' Line(Entry)
        Console.WriteLine("Key=" & k.Key & " Values = " & Entry)
    Next
Next

请记住使用 Option Strict ON,当前代码将字符串视为数字,这不是一个好的做法。 Option Strict ON 将迫使您在处理不同类型的数据时三思而后行。