2013-05-01 6 views
-5

Я строю код, в котором мне нужно пройти через множество функций if/case. Это само по себе на самом деле не проблема только в том, что многие из них, если они похожи.Предотвращение Если внутри функции if (или случаи)

В моем коде он должен пройти через функцию if, и если есть совпадение, то неважно, в каком совпадении ему придется идти через то же самое, если. Но в зависимости от обоих ответов он должен будет перейти в другую часть кода.

Так exmaple:

Switch(A){ 

    case 1: 
    Switch(B){ 
     case 1: do11thing(); 
     case 2: do12thing(); 
    } 

    case 2: 
    Switch(B){ 
     case 1: do21thing(); 
     case 2: do22thing(); 
    } 

} 

Кто-нибудь знает решение вместо того, чтобы поместить переключатель (B) много раз в течение моего кода.

+1

Если вы запрашиваете решение C#, почему бы вам не использовать действительный синтаксис C# в ваших примерах? Что означает 'Если функция 1 дает = 2' означает? – mbeckish

+0

Удален тег C#. – tnw

+0

отредактированный помещенный действительный C# sintaxes в – user2339477

ответ

1

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

напр: -

if (2 == function1) { 
switch(value of function 2) 
{ 
case value_1: 
..//do whatever u want; 
break; 
case value_2: 
..//do whatever u want; 
break; 
default: 
//do some error handling; 
break; 
} 

}

1

В случае, если у вас есть больше прыжков, чем исполняемый код (в случае, что происходит довольно часто при программировании автоматов), вы можете сохранить вашу логику в некоторых вложенная Dictionary, List и/или массив объектов, как показано на следующем:

// Maps A and B values to functionality 
var funcs = new[] { 
         new[] { func00, func01, func02, ... }, 
         new[] { func10, func11, func12, ... }, 
         new[] { func20, func21, func22, ... }, 
         ... 
        }; 

// Actually runs functionality according to your mapping 
funcs[A][B](params); 

Так, в случае A=1 и B=2, будет называться func12.

Конечно, вы можете использовать lambdas (params) => {} как funcs в конструкции.

+0

Я думаю, что это может сработать, я собираюсь попробовать это. Спасибо. – user2339477

+0

@ user2339477 Добро пожаловать. Я использую его в своих программах, когда мне нужна аналогичная логика. – Alexey

+0

Знаете ли вы, что это также работает с ардуино? Я пробовал это, и он говорит, что var не называет тип. – user2339477

0

Единственное, что вы можете сделать, это комбинировать случаи. Например, скажем, что у вас есть строковое значение, которое является вашей внешней переменной switch, а int - внутренней переменной switch. Ваш исходный код может быть:

switch (theString) 
{ 
    case "Foo": 
     switch (theInt) 
     { 
      case 1: DoThing1(); break; 
      case 2: DoThing2(); break; 
      // many other cases 
     } 
     DoFooThing(); 
     break; 
    case "Bar": 
     switch (theInt) 
     { 
      case 1: DoThing1(); break; 
      case 2: DoThing2(); break; 
      // other cases, same as with "Foo" 
     } 
     DoBarThing(); 
     break; 
} 

Вы можете комбинировать случаи и имеют условное:

switch (theString) 
{ 
    case "Foo": 
    case "Bar": 
     switch (theInt) 
     { 
      case 1: DoThing1(); break; 
      case 2: DoThing2(); break; 
      // many other cases 
     } 
     if (theString == "Foo") 
      DoFooThing(); 
     else 
      DoBarThing(); 
     break; 
} 

Тип логики вы описываете, особенно если есть очень много случаев, вероятно, лучше всего реализована с использованием справочной таблицы. Это значительно упрощает логику. Требуется немного больше времени для настройки, но вы можете легко увидеть в таблице, что вы строите точно, что произойдет с любой комбинацией входных значений.

+0

, хотя вы были близки к тому, что я имел в виду, я думаю, что я не был достаточно ясен в своей версии моего вопроса. Извините за это, я снова отредактировал свой вопрос – user2339477

+0

@ user2339477: В таком случае вам лучше использовать подход, основанный на таблицах, который я упомянул, и что Алексей продемонстрировал. –

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