0

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

我有一个特定的变量SomeVariable,并且我希望我在这个变量的值上foreach工作。SomeVariable1,2,3 or 4

所以可以说SomeVariable1item.valueSomeCollection.

如果我想SomeVariable从.2item.valueSomeCollection

等等...

For Each item As KeyValuePair(Of String, Integer) In SomeCollection
    If SomeVariable = 1 Then
            //....
    ElseIf SwitchCount = 2 Then
           //....
    End If
Next
4

3 回答 3

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

于 2014-06-26T19:22:40.847 回答
2

您不能按索引访问字典,但可以按索引访问键集合。你根本不需要循环。

所以像这样。

If SomeVariable = 1 Then
    Return SomeCollection(SomeCollection.Keys(2))
ElseIf SomeVariable = 2 Then 
    ...
End If

如果它真的是结构化的,你可以这样做:

Return SomeCollection(SomeCollection.Keys((SomeVariable * 3) - 1))

您可能需要进行一些错误检查并确保字典的长度正确,但这应该让您走上正确的轨道。

于 2014-06-26T19:07:25.030 回答
0

您始终可以使用通用的 SortedDictionary,我只使用 C#,所以这是我的示例:

SortedDictionary<int,string> dict = new SortedDictionary<int, string>();

foreach( KeyValuePair<int,string> kvp in dict) { ... }
于 2014-06-26T19:35:38.247 回答