仅当值也是可枚举或自定义时,字典才为每个键返回相同的值
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 将迫使您在处理不同类型的数据时三思而后行。
我是菜鸟,所以请记住这个问题。这是一段非常简单的代码:
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 将迫使您在处理不同类型的数据时三思而后行。