将表达式的值打印为字符串

时间:2012-07-05 20:00:16

标签: c# .net

我想采用一个数学表达式,它接受变量并打印(赋值给字符串)填充变量的公式。

int iTwo = 2;
int iResult = 0;

iResult = iTwo * iTwo;

string theString = (iTwo * iTwo).ToString();

在上面的代码中,iResult = 4,theString =“4”

我想做一些填充变量并返回数学表达式的东西,如:

theString = (iTwo * iTwo).ExpressionToString();    

以string =“2 * 2”结束;

思考?

7 个答案:

答案 0 :(得分:4)

您可以使用Expression<>类型。

public static string ExpressionToString<T>(Expression<Func<T>> e)
{
    var un = e.Body as BinaryExpression;
    if (un != null)
    {
        var left = un.Left.ToString();
        var leftEnd = left.Split('.').LastOrDefault();
        var right = un.Right.ToString();
        var rightEnd = right.Split('.').LastOrDefault();
        return e.Body.ToString().Replace(left, leftEnd).Replace(right, rightEnd);
    }
    return e.Body.ToString();
}

Console.WriteLine(ExpressionToString(() => iTwo * iTwo));

//prints (iTwo * iTwo)

您需要使方法更复杂,以解析比简单二进制表达式更复杂的事情,但这是一般的想法。您可以e.Body.ToString(),但由于为您的lambdas制作匿名类型的方式,可能会产生难看的结果,例如:"(value(TestApp.Program+<>c__DisplayClass3).iTwo * value(TestApp.Program+<>c__Dis playClass3).iTwo)"

答案 1 :(得分:1)

有些运营商超载......

class Expression {

    string exprStr;

    public static explicit operator Expression(int value) {
        return new Expression() { exprStr = value.ToString() };
    }

    public static Expression operator *(Expression exp, int value) {
        return new Expression() { exprStr = exp.exprStr + " * " + value.ToString() };
    }

    public override string ToString() {
        return exprStr;
    }

}

class Program {
    static void Main() {
        int iTwo = 2;
        string theString = ((Expression)iTwo * iTwo).ToString();
    }
}

您当然需要以类似的方式重载您需要的其他运算符(例如+/等)。
如果需要,你还应该提供接受除int之外的其他类型的方法,但基本思想保持不变。

请注意,您必须仅将第一个操作数强制转换为Expression,否则只能转换结果。

答案 2 :(得分:1)

您可以使用Expression<>和表达式中存储的参数信息来获取您想要的内容。将表达式存储在Expression<>变量中。

int n1 = 4;
int n2 = 3;
Expression<Func<int, int, int>> exp = (arg1, arg2) => arg1 * arg2;

string expString = exp.ToString(); // (arg1, arg2) => arg1 * arg2
int startRHS = expString.IndexOf("=>") + 2; // starting index of RHS
string onlyRHS = expString.Substring(startRHS).Trim();  // arg1 * arg2

// replace args with values
string withValues = onlyRHS.Replace(exp.Parameters[0].Name, n1.ToString()); // 4 * arg2
withValues = withValues.Replace(exp.Parameters[1].Name, n2.ToString()); // 4 * 3

虽然这不是最强大的解决方案,但它适用于简单的场景。

答案 3 :(得分:0)

您可以创建自己的方法,调用类似于此的方法:

public string ExpressionToString(int parameter1, string operator, int parameter2) {
  return string.Format("{0} {1} {2}", parameter1, operator, parameter2);
}

答案 4 :(得分:0)

请使用创建您的方法并使用下面的代码来满足您的要求

string answer = string.Format("{0} {1} {2} = {3}", iTwo, iTwo, operator, result);

答案 5 :(得分:0)

string ExpressionToString(int first, string operator, int second)
{
   StringBuilder sb = new StringBuilder();
   sb.Append(first.ToString());
   sb.Append(operator);
   sb.Append(second.ToString());
   return sb.ToString();
}

答案 6 :(得分:0)

public static string ExpressionToString(params object[] param)
{
    return string.Join(" ", param.Select(t => t.ToString()).ToArray());
}

使用:

string result = Helper.ExpressionToString(2, "*", 2 , ">=", -10);
//result = "2 * 2 >= -10";