Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何使用ConcurrentDictionary(整数,类)。TryUpdate?_Vb.net_Concurrentdictionary - Fatal编程技术网

Vb.net 如何使用ConcurrentDictionary(整数,类)。TryUpdate?

Vb.net 如何使用ConcurrentDictionary(整数,类)。TryUpdate?,vb.net,concurrentdictionary,Vb.net,Concurrentdictionary,用新值更新ConcurrentDictionary的正确方法是什么?我正在尝试AllWidgets.TryUpdate(id、myWidget、myWidget),它返回false,在这种情况下无法正确更新: Public Class Widget Public ID As Integer Public Name As String Public Sub New(ByVal id As Integer, ByVal name As String) ID =

用新值更新ConcurrentDictionary的正确方法是什么?我正在尝试AllWidgets.TryUpdate(id、myWidget、myWidget),它返回false,在这种情况下无法正确更新:

Public Class Widget
    Public ID As Integer
    Public Name As String
    Public Sub New(ByVal id As Integer, ByVal name As String)
        ID = id
        Name = name
    End Sub
End Class

Dim AllWidgets As New ConcurrentDictionary(Of Integer, Widget)
AllWidgets.TryAdd(1, New Widget(1000, "Widget A"))
AllWidgets.TryAdd(2, New Widget(1001, "Widget B"))

Dim UpdateWidget As New Widget(1001, "Widget BB")
Dim IsUpdated As Boolean = AllWidgets.TryUpdate(2, UpdateWidget, UpdateWidget)
IsUpdated是假的


我想我真的不明白第三个参数对于复杂对象应该如何工作。

这样的话,你永远不会得到正确的答案。首先要做的是使小部件具有可比性,重写GetHashCode()和Equals()。像这样:

Public Class Widget
    ''...
    Public Overrides Function GetHashCode() As Integer
        Return Me.ID.GetHashCode() Xor Me.Name.GetHashCode()
    End Function

    Public Overrides Function Equals(obj As Object) As Boolean
        Dim w = CType(obj, Widget)
        Return w.ID = Me.ID AndAlso w.Name = Me.Name
    End Function
End Class
现在ConcurrentDictionary可以比较小部件。您将通过以下方式获得真实回报:

    Dim UpdateWidget As New Widget(1001, "Widget BB")
    Dim OldWidget As New Widget(1001, "Widget B")
    Dim IsUpdated As Boolean = AllWidgets.TryUpdate(2, UpdateWidget, OldWidget)
    Debug.Assert(IsUpdated)   '' fine