Оператор Switch - переменная "case"? - PullRequest
2 голосов
/ 25 марта 2010

Для ScoreOption я ожидаю получить следующие входные данные "A", "B" и T_ (состояние), например T_NY

Как мне написать оператор переключения регистра для третьего варианта T_ (состояние)?

switch(ScoreOption.ToUpper().Trim())
{
    case "A":
        ....
        break;
    case "B":
        ....
        break;
    case T_????
        ....
        break;
}

С таким же успехом я могу написать заявление if-else?

Ответы [ 5 ]

16 голосов
/ 25 марта 2010
string s = ScoreOption.ToUpper().Trim();
switch(s)
{
    case "A":

        ....

        break;
    case "B":

        ....

        break;
    default:
        if (s.StartsWith("T_"))
        {
        ....
        }                       
        break;

}
10 голосов
/ 25 марта 2010

Вы не можете иметь переменную в качестве регистра в операторе switch. Вам придется сделать что-то вроде

case "T_NY":
case "T_OH":
break;

и т.д.

Теперь вы можете сделать

switch (ScoreOption.ToUpper().Trim())
{
   case "A":
    break;
   case "B":
    break;
   default: 
//catch all the T_ items here. provided that you have specifed all other 
//scenarios above the default option.
    break;

}
2 голосов
/ 25 марта 2010
    switch(ScoreOption.ToUpper().Substring(0, 1)) 
    { 
        case "A": 

            .... 

            break; 
        case "B": 

            .... 

            break; 
        case "T":
            ValidateState(ScoreOption);
            .... 
            break; 

    } 

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

1 голос
/ 25 марта 2010

Вы также можете создать словарь с функциями, содержащими код, который запускается при совпадении значения.

var dict = new Dictionary<string, Action<T,U,V>();
dict.Add("A", (x,y,z) => { 
  ...
});
var func = dict[val];
func(v1,v2,v3);
0 голосов
/ 25 марта 2010

Как насчет обработки A и B по отдельности, и переключателем является решение о состоянии, которое является самой большой переменной Что-то вроде;

char firstCharacter = ScoreOption.ToUpper().CharAt(0);

if(firstCharacter.Equals("A")) {
  ...
}else if(firstCharacter.Equals("B")) {
  ...
}else {
  switch(ScoreOption.Split("_")[1]) {
    case "NY":
      ...
      break;
    case "OH":
      ...
      break;
    default:
      ...
      break;
  }
}
...