0

我将字符串表达式“ 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;

    }

它计算了一些基本的计算操作,但停留在上面提到的字符串操作上。我需要通过执行计算从标记化的字符串中返回整数值有人可以建议我更好的解决方案吗?

4

3 回答 3

4

我想你想对这个字符串执行操作,但是你的操作符是字符串的形式,比如minus for-plus for +

所以基本上你的字符串

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

应该相当于

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

你的结果应该是这个ie的数学计算。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;
}
于 2013-10-16T17:36:08.163 回答
0

您可以使用 LinqAggregate方法并尝试一下。当然,如果表达式格式不正确,它可能会失败。

    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;
        });
于 2013-10-16T17:43:57.213 回答
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;

}

于 2013-10-16T17:47:42.367 回答