web-dev-qa-db-ja.com

辞書のキーを使用して値を更新する

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
8
Nilesh B

変更する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

列挙しているものを変更していないため、例外はスローされません。もちろん、何か他のものがやって来てデータを台無しにした場合、何が起こったかに応じて、すべてを反復しないか、コレクション内のキーが見つかりません。私は自分のマシンでの重い処理のためにこの種のものを書くだけです。