.net 更改字典中对(字符串、整数)的整数值

.net 更改字典中对(字符串、整数)的整数值,.net,vb.net,dictionary,.net,Vb.net,Dictionary,我创建了一个字符串字典,整数: Private m_MonFreq As New Dictionary(Of String, Integer) 在我的代码的某些部分中,我需要更改每对的整数值,但我没有找到一种快速实现的方法 我的方法不起作用: For Each nItem As KeyValuePair(Of String, Integer) In m_MonFreq nItem.Value = lMax - nItem.Value Next 错误为“属性

我创建了一个字符串字典,整数:

Private m_MonFreq As New Dictionary(Of String, Integer)
在我的代码的某些部分中,我需要更改每对的整数值,但我没有找到一种快速实现的方法

我的方法不起作用:

    For Each nItem As KeyValuePair(Of String, Integer) In m_MonFreq

        nItem.Value = lMax - nItem.Value

    Next
错误为“属性值为只读”


有人能告诉我一个很好的方法(也很快)吗?

您可以通过再次使用键访问字典来直接设置字典中的值:

Imports System.Linq    ' for extension method .ToArray()

For Each key As String in m_MonFreq.Keys.ToArray()
    m_MonFreq(key) = lMax - m_MonFreq(key)
Next

请注意,您必须将这些键复制到一个新的可枚举项(在本例中是一个数组)上,才能循环使用另一个枚举器。字典中的值将通过在循环中重新分配值来更改。因此,这将导致异常。

您可以通过再次使用键访问字典来直接设置字典中的值:

Imports System.Linq    ' for extension method .ToArray()

For Each key As String in m_MonFreq.Keys.ToArray()
    m_MonFreq(key) = lMax - m_MonFreq(key)
Next
For Each nItem As String in m_MonFreq.Keys
    m_MonFreq(nItem) = lMax - m_MonFreq(nItem)
Next
请注意,您必须将这些键复制到一个新的可枚举项(在本例中是一个数组)上,才能循环使用另一个枚举器。字典中的值将通过在循环中重新分配值来更改。因此,这将导致一个例外。

另一种使用“函数式”方法并使用更新的值创建新字典的方法

For Each nItem As String in m_MonFreq.Keys
    m_MonFreq(nItem) = lMax - m_MonFreq(nItem)
Next
m_MonFreq = 
    m_MonFreq.ToDictionary(Function(item) item.Key, Function(item) lMax - item.Value)
性能不会受到影响,它与可变
For
循环的不同之处在于创建新的字典实例。在99.99%的情况下,这永远不会成为你表现的瓶颈

但是,您可以摆脱因更改现有对象而导致的所有问题。

另一种使用“函数”方式并使用更新的值创建新字典的方法

m_MonFreq = 
    m_MonFreq.ToDictionary(Function(item) item.Key, Function(item) lMax - item.Value)
性能不会受到影响,它与可变
For
循环的不同之处在于创建新的字典实例。在99.99%的情况下,这永远不会成为你表现的瓶颈


但是,您可以摆脱因更改现有对象而导致的所有问题。

您所说的
也快速
是什么意思?您所说的
也快速
是什么意思?但是字典需要根据键值来定位项。这不是很快。@tMight相反,查找速度非常快<代码>字典为快速查找而优化;如果密钥具有良好分布的哈希函数,则查找将为O(1),其中常量因子基本上是计算哈希的成本。@Waescher我正在获取System.InvalidOperationException“集合已更改。枚举可能无法执行”。你知道这是我这边的事还是你的代码里的事吗?那是真的。为了防止出现这种情况,您应该使用自己的枚举器将密钥复制到一个新数组中。我将更新我的应答器,但字典需要根据键值定位该项。这不是很快。@tMight相反,查找速度非常快<代码>字典为快速查找而优化;如果密钥具有良好分布的哈希函数,则查找将为O(1),其中常量因子基本上是计算哈希的成本。@Waescher我正在获取System.InvalidOperationException“集合已更改。枚举可能无法执行”。你知道这是我这边的事还是你的代码里的事吗?那是真的。为了防止出现这种情况,您应该使用自己的枚举器将密钥复制到一个新数组中。我会更新我的答案