2013-10-16 94 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; 

}