Для ScoreOption я ожидаю получить следующие входные данные "A", "B" и T_ (состояние), например T_NY
ScoreOption
Как мне написать оператор переключения регистра для третьего варианта T_ (состояние)?
switch(ScoreOption.ToUpper().Trim()) { case "A": .... break; case "B": .... break; case T_???? .... break; }
С таким же успехом я могу написать заявление if-else?
string s = ScoreOption.ToUpper().Trim(); switch(s) { case "A": .... break; case "B": .... break; default: if (s.StartsWith("T_")) { .... } break; }
Вы не можете иметь переменную в качестве регистра в операторе 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; }
switch(ScoreOption.ToUpper().Substring(0, 1)) { case "A": .... break; case "B": .... break; case "T": ValidateState(ScoreOption); .... break; }
Но, да, серия утверждений может быть лучше. Это все, что будет генерировать переключатель в любом случае, поскольку система не может выполнять какие-либо хитрые трюки с таблицами переходов на строках.
Вы также можете создать словарь с функциями, содержащими код, который запускается при совпадении значения.
var dict = new Dictionary<string, Action<T,U,V>(); dict.Add("A", (x,y,z) => { ... }); var func = dict[val]; func(v1,v2,v3);
Как насчет обработки 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; } }