私は DataTable を反復処理し、機会が販売につながったかどうかを分離しようとしていますが、機会が発生するための複数の手段があり、出力をユーザーごとに整理したいと考えています。
キーはユーザーで、値フィールドはカスタムデータ構造です。最初にキー/値を追加すると、正常に動作しているように見えますが、辞書に既に存在する値を更新すると、変更が保持されません。カスタム データ型は内部で値を更新しているように見えますが、関数呼び出しが終了しても辞書の値は変更されません。
使用されているデータ構造は次のとおりです。
Public Structure ColleagueSlogs
Public Call As LoggedItems
Public Email As LoggedItems
End Structure
Public Structure LoggedItems
Public SalesLogged As Integer
Public Sub IncrementSales()
Me.SalesLogged += 1
End Sub
Public NonSalesLogged As Integer
Public Sub IncrementNonSales()
Me.NonSalesLogged += 1
End Sub
End Structure
わかりやすくするために少し簡略化した呼び出し関数:
Protected Function SortData(ByVal data As DataTable) As Dictionary(Of String, ColleagueSlogs)
Dim tmpDict As New Dictionary(Of String, ColleagueSlogs)
For Each result As DataRow In data.Rows
Dim tmpName As String = result.Item("UserID")
If tmpDict.ContainsKey(tmpName) Then ''This block does not update correctly
'this exists - increment the relevant variable
Select Case result.Item("Origin")
Case "Call"
Select Case result.Item("Sale")
Case "Yes"
tmpDict(tmpName).Call.IncrementSales()
Case "No"
tmpDict(tmpName).Call.IncrementNonSales()
End Select
Case "Email"
Select Case result.Item("Sale")
Case "Yes"
tmpDict(tmpName).Email.IncrementSales()
Case "No"
tmpDict(tmpName).Email.IncrementNonSales()
End Select
End Select
Else ''This block works as expected
'create data structure, increment the relevant var and add it to dict
Dim tmpSlogs As New ColleagueSlogs
Select Case result.Item("Origin")
Case "Call"
Select Case result.Item("Sale")
Case "Yes"
tmpSlogs.Call.IncrementSales()
Case "No"
tmpSlogs.Call.IncrementNonSales()
End Select
Case "Email"
Select Case result.Item("Sale")
Case "Yes"
tmpSlogs.Email.IncrementSales()
Case "No"
tmpSlogs.Email.IncrementNonSales()
End Select
End Select
tmpDict.Add(tmpName, tmpSlogs)
End If
Next
Return tmpDict
End Function
tmpDict(tmpName).Call.SalesLogged += 1
は値であり、代入のターゲットにすることはできません - 辞書の値が値のように振る舞わないようにする方法はありReadOnly
ますか?
問題はカスタム データ型の定義にありますか? それとも、問題に対する別のアプローチを完全に探す必要がありますか?