我将字符串表达式“ 1加1减2加2减2减5加10 ”分隔。收集了字符串[]中的标记并开始编码术语。 1加1减2加2减2减5加10 = 5
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;
}
它计算了一些基本的计算操作,但坚持上面提到的字符串操作。我需要通过执行计算从标记化字符串返回整数值 任何人都可以建议我更好的解决方案吗?
答案 0 :(得分:4)
我认为您希望对此字符串执行操作,但您的运算符采用字符串形式,如{em>减去 -
或 plus {{1 }}
基本上就是你的字符串
+
应该相当于
string expression="1 plus 1 minus 2 plus 2 minus 2 minus 5 plus 10";
你的结果应该是这个的数学计算。 string myExpression= "1 + 1 - 2 + 2 - 2 - 5 + 10"
因为DataTable.Compute对你来说很方便,可以尝试这个解决方案
5
答案 1 :(得分: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;
});
答案 2 :(得分: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;
}