对于每个字典循环的索引顺序

时间:2014-06-26 18:51:33

标签: vb.net dictionary foreach keyvaluepair

我已经尝试使用for循环Dictionary,但无法实现我想要的目标。

我有一个变量SomeVariable,并且对于此变量的值,我希望我的foreach能够正常工作。 SomeVariable可以是1,2,3 or 4

所以我要说SomeVariable1我要从item.value内的前3个索引(0,1,2)中检索最后SomeCollection。 / p>

如果SomeVariable2,我想从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

3 个答案:

答案 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) { ... }