tags:

views:

23

answers:

1

Hey guys, so I am creating a List(Of String), always of size 9.

This list contains True/False values. I need to go through this list and find the 3 values that are True (will never be more than 3, but could be less) and then set 3 string values in my code to the 3 index's of those values + 1.

Here is my current code:

Private Sub SetDenialReasons(ByVal LoanData As DataRow)
        Dim reasons As New List(Of String)
        With reasons
            .Add(LoanData.Item("IsDenialReasonDTI").ToString)
            .Add(LoanData.Item("IsDenialReasonEmploymentHistory").ToString)
            .Add(LoanData.Item("IsDenialReasonCreditHistory").ToString)
            .Add(LoanData.Item("IsDenialReasonCollateral").ToString)
            .Add(LoanData.Item("IsDenialReasonCash").ToString)
            .Add(LoanData.Item("IsDenialReasonInverifiableInfo").ToString)
            .Add(LoanData.Item("IsDenialReasonIncomplete").ToString)
            .Add(LoanData.Item("IsDenialReasonMortgageInsuranceDenied").ToString)
            .Add(LoanData.Item("IsDenialReasonOther").ToString)
        End With

        Dim count As Integer = 0
        For Each item As String In reasons
            If item = "True" Then
                count += 1
            End If
        Next

        If count = 1 Then
            DenialReason1 = (reasons.IndexOf("True") + 1).ToString
        ElseIf count = 2 Then
            DenialReason1 = (reasons.IndexOf("True") + 1).ToString
            DenialReason2 = (reasons.LastIndexOf("True") + 1).ToString
        ElseIf count >= 3 Then
            Dim tempIndex As Integer = reasons.IndexOf("True")
            DenialReason1 = (reasons.IndexOf("True") + 1).ToString
            DenialReason2 = (reasons.IndexOf("True", tempIndex, reasons.Count - 1) + 1).ToString
            DenialReason3 = (reasons.LastIndexOf("True") + 1).ToString
        End If
    End Sub

I had 3 True's next to each other in the array and the code failed with an exception saying count must be positive or something.

Now if there are less than 3 True's, it should set the remaining DenialReason's that haven't been set yet as blank (however they are set as blank in the constructor already to account for this).

Any ideas?

+1  A: 

Perhaps you could modify your For Each code to handle the assignment of the DenialReasons. This still feels like a hack, but I think it may be cleaner that what you have. If you use this code, you don't need the code that begins with If count = 1...:

    Dim count As Integer = 0
    Dim index As Integer = 1
    For Each item As String In reasons
        If item = "True" Then
            count += 1
            Select Case count
                Case 1
                    DenialReason1 = index.ToString()
                Case 2
                    DenialReason2 = index.ToString()
                Case 3
                    DenialReason3 = index.ToString()
            End Select
        End If
        index += 1
    Next

The index variable above assumes a 1-based index. I think this is cleaner than using IndexOf().

I think a better solution might be to have a list of DenialReasons and add to that list as items are true:

    Dim count As Integer = 0
    Dim index As Integer = 1
    Dim denialReasons As New List(Of String)()
    For Each item As String In reasons
        If item = "True" Then
            denialReasons.Add(index)
        End If
        index += 1
    Next

Then you can simply iterate through your list of denialReasons. This is flexible so that if, for whatever reason, you have more than three DenialReasons, you don't have to add another hard-coded variable.

Ben McCormack