1

私は 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ますか?

問題はカスタム データ型の定義にありますか? それとも、問題に対する別のアプローチを完全に探す必要がありますか?

4

0 に答える 0