拆分字符串并从分隔的字符串标记C#执行计算

时间:2013-10-16 17:20:39

标签: c# .net regex string optimization

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

    }

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

3 个答案:

答案 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;

}