2016-09-05 3 views
0

Может кто-нибудь сократить этот код? Есть 14 кнопок и 8 текстовых полей. Действие будет выполняться, если текстовое поле не пустое, и если оно не пустое, то при нажатии на него кнопка, соответствующая букве в текстовом поле, будет снова видна, делая текстовое поле пустым.Как сократить оператор if-else-if в C#

private void txt1_Click(object sender, EventArgs e) 
{ 
     if (txt1.Text == "J") 
     { 
      txt1.Text = ""; 
      btn1.Visible = true; 
     } 
     else if (txt1.Text == "M") 
     { 
      txt1.Text = ""; 
      btn2.Visible = true; 
     } 
     else if (txt1.Text == "Y") 
     { 
      txt1.Text = ""; 
      btn3.Visible = true; 
     } 
     else if (txt1.Text == "E") 
     { 
      if (btn4.Visible == true) 
      { 
       txt1.Text = ""; 
       btn5.Visible = true; 
      } 
      else 
      { 
       txt1.Text = ""; 
       btn4.Visible = true; 
      } 
     } 
     else if (txt1.Text == "Q") 
     { 
      txt1.Text = ""; 
      btn6.Visible = true; 
     } 
     else if (txt1.Text == "L") 
     { 
      if (btn7.Visible == true) 
      { 
       txt1.Text = ""; 
       btn10.Visible = true; 
      } 
      else 
      { 
       txt1.Text = ""; 
       btn7.Visible = true; 
      } 
     } 
     else if (txt1.Text == "B") 
     { 
      txt1.Text = ""; 
      btn8.Visible = true; 
     } 
     else if (txt1.Text == "C") 
     { 
      txt1.Text = ""; 
      btn9.Visible = true; 
     } 
     else if (txt1.Text == "P") 
     { 
      txt1.Text = ""; 
      btn11.Visible = true; 
     } 
     else if (txt1.Text == "I") 
     { 
      txt1.Text = ""; 
      btn12.Visible = true; 
     } 
     else if (txt1.Text == "K") 
     { 
      txt1.Text = ""; 
      btn13.Visible = true; 
     } 
     else if (txt1.Text == "O") 
     { 
      txt1.Text = ""; 
      btn14.Visible = true; 
     } 
} 
+0

Вы можете использовать функцию 'switch case function'. Также поместите зазор вашего txt1.Text вне функции 'else-if'. – Mark

ответ

4

Допуская все btn переменные являются частью состояния вашего класса, то вы можете объявить метод следующим образом:

public Button Click(String txt) { 
    switch(txt) { 
     case "J": 
      return btn1; 
     case "M": 
      return btn2; 
     case "Y": 
      return btn3; 
     case "E": 
      return (btn4.Visible ? btn5 : btn4); 
     case "Q": 
      return btn6; 
     case "L": 
      return (btn7.Visible ? btn10 : btn7); 
     case "B": 
      return btn8; 
     case "C": 
      return btn9; 
     case "P": 
      return btn11; 
     case "I": 
      return btn12; 
     case "K": 
      return btn13; 
     case "O": 
      return btn14; 
    } 
    return null; 
} 

, а затем вы звоните это:

var button = Click(txt1.Text); 
if(button != null) { 
    button.Visible = true; 
    txt1.Text = ""; 
} 

Если, однако, переменные btn имеют локальный охват , Чем вместо метода вы можете просто определить встроенный Func<String,Button> делегата, как так:

Func<String, Button> Click = txt => { 
    switch(txt) { 
     ... 
    } 
}; 
+0

Вместо "if (btn4.Visible == true) return btn5; еще возвращение btn4;" вы можете просто написать «return (btn4.Visible? btn5: btn4). Вам также не нужно явно сравнивать выражения с истинными или ложными. – EJoshuaS

+0

Где я могу поместить второй код? Внутри или снаружи общедоступной кнопки Click (String txt)? – PlusUltra

+0

Ну @PlusUltra второй фрагмент кода вызывает метод (или делегировать, если вы идете по этому маршруту), поэтому он должен быть снаружи. – Danny

0

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

Из моего опыта, любые огромные цепи if-else в коде представляют собой что-то логическое.

Кроме того, ознакомьтесь с переключателя заявлений

1

Вы все равно придется обрабатывать специальные случаи ("E" и "L"), но вы можете использовать Dictionary<string, Button>, который позволит вам сделайте поиск:

var buttonDictionary = new Dictionary<string, Button>(); 
buttonDictionary["J"] = btn1; 
buttonDictionary["M"] = btn2; 
//etc... 

if (buttonDictionary.Keys.Contains(txt1.Text)) 
{ 
    txt1.Text = ""; 
    buttonDictionary[txt1.Text].Visible = false; 
} 

Это уменьшит большую часть повторяющегося кода.