2013-10-16 397 views
0

我分隔字符串表達式「1加1減2加2減2減5加10」。收集字符串[]中的標記並開始編碼術語。 1加1減去2 + 2減去2減5加10 = 5分割字符串並執行分隔字符串標記的計算C#

public int Calculate(string expression) 
    { 
     //TODO: implement this 
     if (string.IsNullOrEmpty(expression)) 
      return 0; 
     //expression = "100 plus 100 minus 200"; 

     string[] tokens = expression.Split(); 

     int i= 0; 
     int result=0; 

     for (; i < tokens.Length;) 
     { 

      int a = 0; 
      int b = 0; 
      if (i < 1) 
      { 
       a = int.Parse(tokens[i]); 
       i++; 
      } 
      else if (i % 2 != 0 && tokens[i].ToString() == "plus") 
      { 
       i++; 
       b = int.Parse(tokens[i]); 
       a = result; 
       result = a + b; 
       i = i + 2; 


      } 

      if (tokens[i].ToString() == "plus") 
      { 
       i++; 
       b = int.Parse(tokens[i]); 
       result += a + b; 
       i = i + 2; 

      } 
      else if(i>1) 
      { 
       a = result; 

       b = int.Parse(tokens[i]); 
       result = a - b; 
       i=i+1; 

      } 

      else 
      { 
       i++; 
       //a = result; 
       b = int.Parse(tokens[i]); 
       result += a - b; 
       i++; 

      } 



     } 


      return result; 

    } 

它計算出的一些基本的計算操作,但是提到串上面粘貼在operation.I需要通過執行計算從標記化字符串返回整數值 任何人都可以提出更好的解決方案嗎?

+3

你跟你的soluition有什麼問題?它工作,如果沒有,爲什麼不呢?它不會編譯嗎,它是否拋出異常,輸出是錯誤的還是什麼? – Servy

+0

我豎起大拇指不知道你在做什麼 – Jonesopolis

+0

你是否通過調試代碼?爲什麼我= i + 2:? – Paparazzi

回答

4

我想你想對這個字符串進行操作,但你的運營商都在串像減去-+形式。

所以基本上你的字符串

string expression="1 plus 1 minus 2 plus 2 minus 2 minus 5 plus 10"; 

應相當於

string myExpression= "1 + 1 - 2 + 2 - 2 - 5 + 10" 

和你的結果應該是這樣的,即的數學運算。 5

對於DataTable.Compute將方便你,可以嘗試此解決方案

public int Calculate() 
{ 
    string expression = "1 plus 1 minus 2 plus 2 minus 2 minus 5 plus 10"; 
    string mathExpression = expression.Replace("plus", "+").Replace("minus", "-"); 
    DataTable dt = new DataTable(); 
    var value = dt.Compute(mathExpression, ""); 
    return (int)value; 
} 
+0

對'DataTable.Compute()'有+1,這對我來說是新的。 – devuxer

0

您可以使用LINQ Aggregate方法和嘗試。當然,如果表達不好,它可能會失敗。

var expression = "1 plus 1 minus 2 plus 2 minus 2 minus 5 plus 10"; 

    var exp = expression.Split(' '); 

    var count = 0; 
    var result = exp.Aggregate(Convert.ToInt32(exp[0]), (acc, next) => 
     { 
      count++; 
      if (next == "plus") 
       return acc + Convert.ToInt32(exp[count]); 
      if (next == "minus") 
       return acc - Convert.ToInt32(exp[count]); 
      return acc; 
     }); 
0

你正在做的很多事情。

第一個數字總是起點,你的初始結果。
然後,您需要通過步驟2循環所有令牌。
在每個循環中,第一項是操作員,第二項是數字。
根據第一項[i],將值[i + 1]賦值給結果。

// This assume perfect parameter 
public int Calculate(string expression) 
{ 

int result = 0; 
string[] tokens = null; 

tokens = expression.Split(" "); 
result = Int32.Parse(tokens[0]); 

for (int i = 1; i <= tokens.Length - 1; i += 2) { 
    if (tokens[i] == "plus") 
    result += Int32.Parse(tokens[i + 1]); 
    else if (tokens[i] == "minus") 
    result -= Int32.Parse(tokens[i + 1]); 
} 

return result; 

}