VB.NETWindowsアプリケーションでDictionary
を使用しています。
Dictionary
にいくつかの値を追加しましたが、それらのキーを使用していくつかの値を編集したいと思います。
例:以下にDATAテーブルがあり、キーの値を更新したい-"DDD"を1に
AAA - "0" BBB - "0" CCC - "0' DDD - "0"
これはどのように行うことができますか?
For Each kvp As KeyValuePair(Of String, String) In Dictionary1
If i = value And kvp.Value <> "1" Then
NewFlat = kvp.Key.ToString
---------------------------------------------
I want to update set the Value 1 of respective key.
What should I write here ?
---------------------------------------------
IsAdded = True
Exit For
End If
i = i + 1
Next kvp
変更するkvpの値がわかっている場合は、辞書を繰り返す必要はありません(for each kvp
)。 「DDD」/「0」を「DDD」/「1」に変更するには:
myDict("DDD") = "1"
cant use the KeyValuePair its gives error after updating it as data get modified.
For Each
ループでanyコレクションを変更しようとすると、InvalidOperationException
が返されます。コレクションが変更されると、列挙子(For Each
変数)は無効になります。特に辞書の場合、これは必要ありません。
Dim col As New Dictionary(Of String, Int32)
col.Add("AAA", 0)
...
col.Add("ZZZ", 0)
Dim someItem = "BBB"
For Each kvp As KeyValuePair(Of String, Int32) In col
If kvp.Key = someItem Then
' A) Change the value?
vp.Value += 1 ' will not compile: Value is ReadOnly
' B) Update the collection?
col(kvp.Key) += 1
End If
Next
Key
プロパティとValue
プロパティは読み取り専用であるため、メソッドAはコンパイルされません。
メソッドBはカウント/値を変更しますが、Next
が無効になったため、kvp
で例外が発生します。
辞書には、これらすべてを実行するための組み込みメソッドがあります。
If myDict.ContainsKey(searchKey) Then
myDict(searchKey) = "1"
End If
キーを使用して、辞書から取得/設定/変更/削除します。
辞書の各項目に対して本当に何かをしたい場合があります。たとえば、辞書が40MBのRAMであるように見えても、巨大なヒープからデータを取得するのはほぼ瞬時に見えるため、辞書を使用して非常に大きなデータ構造を格納します。
例えば:
dim col as new dictionary (of string, myStructData)
dim colKeys() as string = col.keys.toArray()
for each colKey in colKeys
dim tempVal as new myStructData= col(colKey)
'do whatever changes you want on tempVal
col(colKey)=tempVal
next colKey
列挙しているものを変更していないため、例外はスローされません。もちろん、何か他のものがやって来てデータを台無しにした場合、何が起こったかに応じて、すべてを反復しないか、コレクション内のキーが見つかりません。私は自分のマシンでの重い処理のためにこの種のものを書くだけです。