2015-04-17 3 views
0

У меня есть 3 разных переменных, которые все 3 могут иметь 2 разных значения. Каждой комбинации нужно что-то делать. Я могу привести все это в инструкцию IF, но мне было интересно, нет ли более элегантного/правильного/более короткого решения. 3 переменные могут иметь значение 1 или 0 (например, бинарная таблица истинности).IF-заявление или что-то более эффективное?

+0

Вложенные операторы if являются наиболее эффективным способом обработки этого дерева решений. – Mangist

+0

https://support.office.com/en-us/article/IIf-Function-32436ecf-c629-48a3-9900-647539c764e3 – Vasily

+1

что вы уже тестировали? –

ответ

0

Хотя это не строго более эффективной чем бинарное разветвление (если вы не можете предсказать частоту аргументов), одна альтернативы использовать особенность синтаксиса VBA и поместить его в Select Case структуре:

Private Sub Example(one As Boolean, two As Boolean, three As Boolean) 

    Select Case True 
     Case one And Not two And Not three 
      Debug.Print "Case 1" 
     Case one And Not two And three 
      Debug.Print "Case 2" 
     Case one And two And Not three 
      Debug.Print "Case 3" 
     Case one And two And three 
      Debug.Print "Case 4" 
     Case two And Not three 
      Debug.Print "Case 5" 
     Case two And three 
      Debug.Print "Case 6" 
     Case three 
      Debug.Print "Case 7" 
     Case Else 
      Debug.Print "Case 8" 
    End Select 

End Sub 

Это, конечно, легче смотреть, чем альтернатива, если:

Private Sub Example2(one As Boolean, two As Boolean, three As Boolean) 

    If one Then 
     If two Then 
      If three Then 
       Debug.Print "Case 4" 
      Else 
       Debug.Print "Case 3" 
      End If 
     Else 
      If three Then 
       Debug.Print "Case 2" 
      Else 
       Debug.Print "Case 1" 
      End If 
     End If 
    Else 
     If two Then 
      If three Then 
       Debug.Print "Case 6" 
      Else 
       Debug.Print "Case 5" 
      End If 
     Else 
      If three Then 
       Debug.Print "Case 7" 
      Else 
       Debug.Print "Case 8" 
      End If 
     End If 
    End If 

End Sub 

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

Смежные вопросы