2015-02-06 2 views
1

Каков правильный способ обновления ConcurrentDictionary с новым значением? Я пытаюсь AllWidgets.TryUpdate (идентификатор, MyWidget, MyWidget) и возвращает ложь, и не правильно обновлять в этом типе сценария:Как использовать ConcurrentDictionary (Integer, Class) .TryUpdate?

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 является Ложные

Я предполагаю, что я действительно не понимаю, как третий параметр должен работать для сложных объектов.

ответ

1

Вы никогда не получите Истину таким образом. Первое, что вам нужно сделать, это сделать Widgets сопоставимыми, переопределить 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 может сравнивать виджеты. Вы получите True возврат таким образом:

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