Member 11856456 Ответов: 1

Почему эти утверждения отличаются?


Я счел, что лучше всего перейти от переменных string a date для проверки дубликатов к простой проверке строка за строкой, используя информацию, которая была в datarow.

Однако я попытался преобразовать переменные моего класса только в источник datarow.

вот исходный код:

If newindividual.First_name = matchedfirstname And newindividual.Last_name = matchedlastname _
           And newindividual.Date_of_birth = matchedDOB Then
            matched = True
            GoTo found
        ElseIf newindividual.First_name = matchedfirstname And newindividual.Last_name = matchedlastname _
               And newindividual.Date_of_death = matchedDOD And newindividual.Date_of_birth = matchedDOB Then
            matched = True
            GoTo found
        ElseIf newindividual.First_name = matchedfirstname And newindividual.Last_name = matchedlastname _
               And newindividual.Date_of_death = matchedDOD Then
            matched = True
            GoTo found
        End If


Вот во что я попытался превратить эту информацию

If StrConv(Trim(temptable.Rows(I)("First_name").ToString), vbProperCase) = StrConv(Trim(dt.Rows(I2)("First_name").ToString), vbProperCase) And StrConv(Trim(temptable.Rows(I)("Last_name").ToString), vbProperCase) = StrConv(Trim(dt.Rows(I2)("Last_name").ToString), vbProperCase) Then
           If temptable.Columns.Contains("Date_of_birth") And Not IsDBNull(temptable.Rows(I)("Date_of_birth")) And temptable.Columns.Contains("Date_of_death") And Not IsDBNull(temptable.Rows(I)("Date_of_death")) Then
               If Not IsDBNull(dt.Rows(I2)("Date_of_birth")) And Not IsDBNull(dt.Rows(I2)("Date_of_death")) Then
                   If CDate(Trim(temptable.Rows(I)("Date_of_birth").ToString)) = CDate(Trim(dt.Rows(I2)("Date_of_birth").ToString)) And CDate(Trim(temptable.Rows(I)("Date_of_death").ToString)) = CDate(Trim(dt.Rows(I2)("Date_of_death"))) Then
                       matched = True
                       GoTo found
                   End If
               End If
           ElseIf temptable.Columns.Contains("Date_of_birth") And Not IsDBNull(temptable.Rows(I)("Date_of_birth")) Then
               If Not IsDBNull(dt.Rows(I2)("Date_of_birth")) Then
                   If CDate(Trim(temptable.Rows(I)("Date_of_birth").ToString)) = CDate(Trim(dt.Rows(I2)("Date_of_birth").ToString)) Then
                       matched = True
                       GoTo found
                   End If
               End If
           ElseIf temptable.Columns.Contains("Date_of_death") And Not IsDBNull(temptable.Rows(I)("Date_of_death")) Then
               If Not IsDBNull(dt.Rows(I2)("Date_of_death")) Then
                   If CDate(Trim(temptable.Rows(I)("Date_of_death").ToString)) = CDate(Trim(dt.Rows(I2)("Date_of_death").ToString)) Then
                       matched = True
                       GoTo found
                   End If
               End If
           End If
       End If


Когда я запускаю новый код во вложенном цикле, в цикле 2 появляется больше итераций, однако исходный код имеет правильное количество итераций. Разве это не одно и то же?

Что я уже пробовал:

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

1 Ответов

Рейтинг:
10

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
Private Function Double(ByVal value As Integer) As Integer
    Return value * value
End Function

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!