0

forloop withを使用して手を試しましDictionaryたが、本当にやりたいことを達成できませんでした。

特定の変数がSomeVariableあり、この変数の値で機能させたいと考えていforeachます。SomeVariableすることができます1,2,3 or 4

つまり、 内の最初の 3 つのインデックス (0,1,2) から最後のものを取得したいとしSomeVariableます。1item.valueSomeCollection

そして、SomeVariable内の次の 3 つのインデックス (3,4,5) の中から2最後のものを取得したい場合。item.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 に答える