Удалить повторение из инструкции if-else

#vb.net #if-statement

#vb.net #if-инструкция

Вопрос:

Я написал if...else инструкцию, которая использует массив myArr и строку myStr следующим образом:

 If myArr.Length > 0 AndAlso myArr(0) = "-1" Then
  'Do stuff 1
ElseIf myStr= "xyz" Then
  'Do stuff 2
ElseIf myArr.Length > 0 Then
  'Do Stuff 3
Else
  'Do Nothing
End If
  

Это работает именно так, как мне нужно. Но это выглядит действительно запутанным, в основном потому, что длина массива проверяется дважды. Должен быть более понятный способ написать это, но я не могу придумать ни одного.

Просто для пояснения …. порядок выполнения каждого оператора имеет решающее значение. т. е. Материал 1 имеет приоритет над материалом 2, который имеет приоритет над материалом 3.

Комментарии:

1. 1 за вопрос, над которым стоит подумать, прежде чем врываться!

2. И 1 за оба ваших комментария за то, что вы не торопитесь! 🙂

Ответ №1:

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

Либо вы в конечном итоге будете делать разные вещи, либо делать повторяющиеся вещи. например:

 If myArr.Length > 0 Then
   If myArr(0) = "-1" Then
      'Do stuff
   Else
      'Do stuff
   End If
ElseIf myStr= "xyz" Then
  'Do stuff
Else
  'Do Nothing
End If
  

Это приведет к тому, что mystr=»xyz» не будет выполняться whenn myArr(0) <> -1, тогда как это могло быть раньше.

Комментарии:

1. Ну что ж. Похоже, что мой код остается таким, какой он есть. Спасибо за продуманный ответ!

Ответ №2:

Вы могли бы избавиться от множественных проверок myArr.Length с помощью вложенных If инструкций, но это делает код менее понятным.

Понятный подход (т. Е. такой, который можно легко понять) — это тот, который позволяет вам прочитать фрагмент кода без необходимости запоминать контекст, в котором выполняется код. Благодаря вложенности If инструкций в рабочей памяти считывателя (или кратковременной памяти) должно храниться больше информации, чтобы определить значение кода.

Ответ №3:

Я думаю, это помогло бы:

 If myArr.Length > 0 Then
   If myArr(0) = "-1" Then
      'Do stuff
   Else
      'Do stuff
   End If
ElseIf myStr= "xyz" Then
  'Do stuff
Else
  'Do Nothing
End If
  

Комментарии:

1. Это не то же самое. В этом случае вы в конечном итоге будете выполнять оба параметра myArr (0) <> -1, даже если myStr = «xyz».

2. ДА. Боюсь, порядок имеет решающее значение.

3. Смотрите мой ответ. Не думайте, что вы можете изменить это, не нарушив его или не сделав более запутанным.

4. @JonEgerton если мои глаза меня не обманывают … это точно так же, как то, что я опубликовал 🙂

5. Код тот же. Но слова не являются. В основном ответ, похоже, «это не может быть упрощено».

Ответ №4:

Что вам нужно, так это вложенный if

 If myArr.Length > 0 Then
  'Do stuff for non zero length
    If myArr(0) = "-1" Then
       'Do stuff for -1 and you already have checked for array length
    End If 
End If
  

Ответ №5:

 If myArr.Length > 0 Then
  If myArr(0) = "-1" Then
    ' Stuff 1
  Else
    ' Stuff 3
  End If
ElseIf myStr = "xyz"
' Stuff 2
End If
  

… больше ничего не требуется

Комментарии:

1. Спасибо, но проблема в том, что материал 2 должен иметь более высокий приоритет, чем материал 3.

2. Совершенно верно, я попал в безумную спешку, чтобы ответить на вопрос 🙂

Ответ №6:

Вы можете разложить инструкции следующим образом:

 If myArr.Length > 0 Then
    If myArr(0) = "-1" Then
       'Do stuff
    Else
       'Do sstuff
    End If
Else
    If myyStr= "xyz" Then
        'Do stuff
    End If
End If
  

Комментарии:

1. Это не то же самое. В этом случае вы в конечном итоге будете выполнять как myArr(0) <> -1, так и myStr = «xyz»

2. Это отличается от when myArr.Length > 0 AndAlso myyStr= "xyz" .

3. @Джон, я согласен, это не то же самое, что в исходном коде. Но это плохой тон и, безусловно, неясный способ комбинировать условия, которые логически вообще не ограничены. Я изменил код, не могли бы вы прокомментировать, пожалуйста?

4. @Освальд, чем это отличается?

5. @Zaur Я попытался прояснить свой вопрос сейчас, чтобы было ясно, в каком порядке «материал» должен быть выполнен. Это должен быть материал 1,2,3. Но с вашим предложенным методом это материал 1,3,2.