2016-02-14 4 views
3

Я новичок в C#, и я пытаюсь создать калькулятор. Я храню арифметический оператор в строке, есть ли способ, которым я могу использовать оператор для решения уравнения?C# использовать строковую переменную как арифметический оператор

Мой код:

else if (btn_name == "plus" || btn_name == "minus") 
{ 
    bol = true; 
    try 
    { 
     if (solve == "") 
     { 
      string num1 = Screen.Text; 
      first = float.Parse(num1); 
      second = first + second; 
      Screen.Text = second.ToString(); 
      Screen_upper.Text = upper_text + text + " + "; 
     } 
     else 
     { 
      second = first (**#I want to use the operator here#**) second; 
     } 
    } 
    catch 
    { 
     Screen.Text = second.ToString(); 
     Screen_upper.Text = upper_text + text + " + "; 
    } 
    solve = "+"; 
} 
+0

Существует утилита, которая предоставляет общие операторы как методы. http://www.yoda.arachsys.com/csharp/genericoperators.html. Надеюсь, это поможет вам найти хорошее решение. Также используйте Enums вместо строки, чтобы определить все ваши операции. – vendettamit

+1

Я удалил свой предыдущий комментарий, потому что мне нужно было перефразировать, поскольку это было непонятно. Существует множество способов приблизиться к этому. Однако, если фактически преобразовать его непосредственно в оператор, ответ «нет». [This Post] (http://stackoverflow.com/questions/925886/c-sharp-convert-a-string-for-use-in-a-logical-condition) - это то, что действительно может вам помочь. В нем показаны два возможных подхода, как с соответствующими результатами. Пользовательские классы и дженерики с логическим переключателем - это хорошие способы его приближения. – Gabe

ответ

1

Нет, я думаю, что вы не можете. Проверьте значение, которое вы имеете в btn_name и если это «минус» выполнять арифметические операции

if (btn_name == "minus") 
{ 
    second = first - second; 
} 
+0

Да, я делаю то же самое, но если у меня есть 30 операций, тогда это означает 30, если блокировки else. –

3

Вы можете использовать только if или switch оператора и ветви вашей логики для каждого else/case блока:

switch(btn_name) 
{ 
    case "plus": 
     second = first + minus; 
     break; 
    case "minus": 
     second = first - minus; 
     break; 
    case "div": 
     second = first/minus; 
     break; 
} 

Но это очень трудно чтобы прочитать этот код. Альтернативным решением является использование предопределенного хранилища операторов. Один из способов ее реализации является использование простого Dictionary<string, Func<float, float, float>> и delegate:

// it's class member, not a local variable 
Dictionary<string, Func<float, float, float>> operators = new Dictionary<string, Func<float, float, float>>(); 
operators.Add("plus", (first, second) => first + second); 
operators.Add("minus", (first, second) => first - second); 
operators.Add("div", (first, second) => first/second); 

Теперь вы можете использовать следующий код (завершенные ваш пример):

if (solve == "") 
{ 
    string num1 = Screen.Text; 
    first = float.Parse(num1); 
    second = first + second; 
    Screen.Text = second.ToString(); 
    Screen_upper.Text = upper_text + text + " + "; 
} 
else 
{ 
    second = operators[btn_name](first, second); 
} 

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

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

+0

Это то, что я пытался сказать, но без исходного кода. Просто звучало как домашнее задание для меня. Английский жесткий ... +1 – Gabe

1

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

var dict = new Dictionary<string, Func<int, int, int>>() { 
    { "add", AddFunc }, 
    { "minus", MinusFunc } 
}; 

public static int AddFunc(int arg1, int arg2) 
{ 
    return arg1 + arg2; 
} 

public static int MinusFunc(int arg1, int arg2) 
{ 
    return arg1 - arg2; 
} 

Вызов методов, как просто как dict["minus"](arg1,arg2)

Конечно, было бы разумнее использовать Enums вместо строк, но вы получите эту идею.

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