2016-02-14 432 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。希望這會幫助你找出一個好的解決方案。還使用枚舉而不是字符串來定義所有操作。 – vendettamit

+1

我刪除了我之前的評論,因爲我不得不重述,因爲它不清楚。有很多方法可以解決這個問題。但是,就實際將其直接轉換爲操作員而言,答案是「否」。 [這篇文章](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如果其他塊。 –

3

只需使用ifswitch運營商和分支機構的邏輯每個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)

當然,更有意義的是使用枚舉而不是字符串,但你明白了。