我已经尝试使用for
循环Dictionary
,但无法实现我想要的目标。
我有一个变量SomeVariable
,并且对于此变量的值,我希望我的foreach
能够正常工作。 SomeVariable
可以是1,2,3 or 4
所以我要说SomeVariable
是1
我要从item.value
内的前3个索引(0,1,2)中检索最后SomeCollection
。 / p>
如果SomeVariable
为2
,我想从item.value
内的后续3个索引(3,4,5)中检索最后SomeCollection
。
等等......
For Each item As KeyValuePair(Of String, Integer) In SomeCollection
If SomeVariable = 1 Then
//....
ElseIf SwitchCount = 2 Then
//....
End If
Next
答案 0 :(得分:3)
字典没有已定义的顺序,因此您感知的任何顺序都是暂时的。来自MSDN:
未指定.KeyCollection中键的顺序,但它与Values属性返回的.ValueCollection中的关联值的顺序相同。
尝试使用Keys集合确定顺序显示它是如何瞬态的:
Dim myDict As New Dictionary(Of Integer, String)
For n As Int32 = 0 To 8
myDict.Add(n, "foo")
Next
For n As Int32 = 0 To myDict.Keys.Count - 1
Console.WriteLine(myDict.Keys(n).ToString)
Next
输出按顺序打印0 - 8,正如您所料。然后:
myDict.Remove(5)
myDict.Add(9, "bar")
For n As Int32 = 0 To myDict.Keys.Count - 1
Console.WriteLine(myDict.Keys(n).ToString)
Next
输出为:0,1,2,3,4,9(!),6,7,8
如您所见,它重用旧插槽。任何依赖于某个位置的事物的代码最终都会破坏。添加/删除的越多,它获得的无序越多。如果您需要Dictionary
使用SortedDictionary
的订单,请
答案 1 :(得分:2)
您无法通过索引访问字典,但可以按索引访问密钥集合。你根本不需要循环。
这样的事情。
If SomeVariable = 1 Then
Return SomeCollection(SomeCollection.Keys(2))
ElseIf SomeVariable = 2 Then
...
End If
如果它是真正的结构,你可以这样做:
Return SomeCollection(SomeCollection.Keys((SomeVariable * 3) - 1))
您可能需要进行一些错误检查并确保字典的长度正确,但这应该会让您走上正确的轨道。
答案 2 :(得分:0)
你总是可以使用通用的SortedDictionary,我只使用C#所以这是我的例子:
SortedDictionary<int,string> dict = new SortedDictionary<int, string>();
foreach( KeyValuePair<int,string> kvp in dict) { ... }